Если вы по-прежнему хотите, чтобы Canvas2D и WebGL по-прежнему работали, вы не сможете скрыть их, поскольку они могут отсканировать отпечатки пальцев путем фактического рендеринга.
Вы можете отключить их с помощью
HTMLCanvasElement.prototype.getContext = function() {
return null;
};
Хотяфакт, что они не существуют, также является точкой данных.
В противном случае ваша оболочка может иметь некоторые проблемы.
Сначала вы действительно должны установить функцию до создания контекста.
Во-вторых, ваша последняя строка должна быть
oldParam.call(this, parameter);
Также вы этого не сделалипокажите debugInfo
, но вы можете использовать WebGLRenderingContext
вместо этого или вы можете просто жестко закодировать числа
Что касается http://www.deviceinfo.me, вы должны убедиться, что ваш патч работает во всех фреймах и рабочих перед любым другимJavaScript.
WebGLRenderingContext.prototype.getParameter = function(origFn) {
const paramMap = {};
paramMap[0x9245] = "Foo"; // UNMASKED_VENDOR_WEBGL
paramMap[0x9246] = "Bar"; // UNMASKED_RENDERER_WEBGL
paramMap[0x1F00] = "Nobody"; // VENDOR
paramMap[0x1F01] = "Jim"; // RENDERER
paramMap[0x1F02] = "Version 1.0"; // VERSION
return function(parameter) {
return paramMap[parameter] || origFn.call(this, parameter);
};
}(WebGLRenderingContext.prototype.getParameter);
// --- test
const gl = document.createElement('canvas').getContext('webgl');
const ext = gl.getExtension('WEBGL_debug_renderer_info');
show(gl, gl, [
'VENDOR',
'RENDERER',
'VERSION',
]);
if (ext) {
show(gl, ext, [
'UNMASKED_VENDOR_WEBGL',
'UNMASKED_RENDERER_WEBGL',
]);
}
function show(gl, base, params) {
for (const param of params) {
console.log(param, ':', gl.getParameter(base[param]));
}
}