1
0
mirror of https://github.com/kkapsner/CanvasBlocker synced 2024-12-22 12:50:36 +01:00
CanvasBlocker/test/settingsLoading.php

121 lines
3.5 KiB
PHP
Raw Normal View History

2017-12-12 21:56:22 +01:00
<!DOCTYPE html>
<html>
<head>
2019-09-04 00:30:20 +02:00
<title>Settings loading test</title>
2019-02-20 08:13:37 +01:00
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link href="testIcon.svg" type="image/png" rel="icon">
<link href="testIcon.svg" type="image/png" rel="shortcut icon">
2017-12-12 21:56:22 +01:00
<script>
2019-12-16 19:27:28 +01:00
const firstDescriptor = Object.getOwnPropertyDescriptor(HTMLCanvasElement.prototype, "getContext");
console.log(new Date(), "starting first fingerprint", window.name);
2017-12-13 20:08:53 +01:00
function fingerPrint(){
2019-12-16 19:27:28 +01:00
"use strict";const canvas = document.createElement("canvas");
2017-12-13 20:08:53 +01:00
canvas.setAttribute("width", 220);
canvas.setAttribute("height", 30);
2019-12-16 19:27:28 +01:00
const fp_text = "BrowserLeaks,com <canvas> 10";
2017-12-13 20:08:53 +01:00
2019-12-16 19:27:28 +01:00
const ctx = canvas.getContext("2d");
2017-12-13 20:08:53 +01:00
ctx.textBaseline = "top";
ctx.font = "14px 'Arial'";
ctx.textBaseline = "alphabetic";
ctx.fillStyle = "#f60";
ctx.fillRect(125, 1, 62, 20);
ctx.fillStyle = "#069";
ctx.fillText(fp_text, 2, 15);
ctx.fillStyle = "rgba(102, 204, 0, 07)";
ctx.fillText(fp_text, 4, 17);
return canvas.toDataURL();
}
2019-12-16 19:27:28 +01:00
async function hash(url){
2019-11-30 02:05:37 +01:00
"use strict";
2019-12-16 19:27:28 +01:00
const buffer = new TextEncoder("utf-8").encode(url);
const hash = await crypto.subtle.digest("SHA-256", buffer);
const chunks = [];
(new Uint32Array(hash)).forEach(function(num){
chunks.push(num.toString(16));
2017-12-13 20:08:53 +01:00
});
2019-12-16 19:27:28 +01:00
return chunks.map(function(chunk){
return "0".repeat(8 - chunk.length) + chunk;
}).join("");
2017-12-13 20:08:53 +01:00
}
2019-12-16 19:27:28 +01:00
let firstFingerprint = false;
2017-12-12 21:56:22 +01:00
try {
2019-11-30 02:05:37 +01:00
firstFingerprint = fingerPrint();
2017-12-12 21:56:22 +01:00
}
2019-11-28 01:26:35 +01:00
catch (error){
console.log(new Date(), error);
2017-12-12 21:56:22 +01:00
}
</script>
2019-09-04 00:30:20 +02:00
<style>
#output {
padding: 1em;
}
.ok {
background-color: green;
}
.kok {
background-color: orange;
}
.nok {
background-color: red;
}
2019-09-04 00:30:20 +02:00
</style>
2017-12-12 21:56:22 +01:00
</head>
<body>
2019-09-04 00:30:20 +02:00
<h1>Settings loading test</h1>
<h2>Expected result</h2>
<ul>
<li>the background of the test result is green and states "good"</li>
<li>the displayed hash changes upon reload</li>
</ul>
<h2>Test</h2>
<div id="output"></div>
2017-12-12 21:56:22 +01:00
<script>
2017-12-13 20:08:53 +01:00
if (firstFingerprint){
2019-12-16 19:27:28 +01:00
const output = document.getElementById("output");
2019-09-04 00:30:20 +02:00
output.textContent = "context API not blocked";
output.appendChild(document.createElement("br"));
2019-12-16 19:27:28 +01:00
window.setTimeout(async function(){
2019-11-30 02:05:37 +01:00
"use strict";
console.log(new Date(), "starting second fingerprint", window.name);
2019-12-16 19:27:28 +01:00
const secondDescriptor = Object.getOwnPropertyDescriptor(HTMLCanvasElement.prototype, "getContext");
if (firstDescriptor.value === secondDescriptor.value){
output.appendChild(document.createTextNode("descriptor did not change -> good!"));
output.classList.add("ok");
}
else {
output.appendChild(document.createTextNode("descriptor changed -> bad!"));
console.log(firstDescriptor, secondDescriptor);
output.classList.add("nok");
}
2019-09-04 00:30:20 +02:00
output.appendChild(document.createElement("br"));
2019-12-16 19:27:28 +01:00
const secondFingerprint = fingerPrint();
2017-12-13 20:08:53 +01:00
if (firstFingerprint === secondFingerprint){
2019-12-16 19:27:28 +01:00
const firstHash = await hash(firstFingerprint);
output.appendChild(document.createTextNode("fingerprint consistent (" + firstHash + ") -> good!"));
output.classList.add("ok");
2017-12-13 20:08:53 +01:00
}
else {
2019-12-16 19:27:28 +01:00
const hashes = await Promise.all([hash(firstFingerprint), hash(secondFingerprint)]);
output.appendChild(
document.createTextNode(
"fingerprint not consistent (" +
hashes[0] + " != " + hashes[1] +
") -> very bad! (potential fingerprint leak)"
)
);
output.classList.add("nok");
2017-12-13 20:08:53 +01:00
}
}, 500);
}
else {
2019-09-04 00:30:20 +02:00
output.textContent = "context API blocked";
output.classList.add("kok");
2017-12-13 20:08:53 +01:00
}
2017-12-12 21:56:22 +01:00
</script>
</body></html>