1$( document ).ready(function() { 2 var audio = document.createElement('audio'); 3 var canvas = document.createElement("canvas"); 4 var webgl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl"); 5 var debugInfo = webgl.getExtension("webgl_debug_renderer_info"); 6 var gpu = webgl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL); 7 var gpu_vendor = webgl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL); 8 9 var _nav = window.navigator; 10 var _plugins = []; 11 if(typeof _nav['plugins'] != 'undefined'){ 12 for(var _idx in _nav['plugins']){ 13 _plugins.push(_nav['plugins'][_idx]['name']); 14 } 15 } 16 17 function getCanvasFingerprint() { 18 const canvas = document.createElement("canvas"); 19 canvas.width = 300; 20 canvas.height = 150; 21 const ctx = canvas.getContext("2d"); 22 23 // Forme simple 24 ctx.fillStyle = "#ccc"; 25 ctx.fillRect(0, 0, canvas.width, canvas.height); 26 27 // Texte Unicode multilingue 28 const testStrings = [ 29 "Hello, world!", // Standard ASCII 30 "Ça va bien ?", // Accent aigu et cédille 31 "München ist schön", // Umlaut : ü, ö 32 "Español: ¿cómo estás?", // Inversé : ¿ 33 "Français: où est l'hôtel ?",// Apostrophes, accents 34 "Straße und Fußball", // Eszett (ß) 35 "âêîôû äëïöü ß ç ñ", // Latin étendu 1 36 ]; 37 38 // Rendu de chaque chaîne avec différentes polices et styles 39 testStrings.forEach((str, i) => { 40 ctx.font = `${14 + i}px '${i % 2 === 0 ? "Arial" : "Times New Roman"}'`; 41 ctx.fillStyle = `rgb(${i * 30 % 255}, ${255 - i * 40 % 255}, ${i * 70 % 255})`; 42 ctx.fillText(str, 10, 20 + i * 16); 43 }); 44 45 // Extraire les données de pixels (échantillonnage partiel) 46 const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data; 47 let pixelSample = ""; 48 for (let i = 0; i < imageData.length; i += 12) { 49 pixelSample += String.fromCharCode(imageData[i]); // Utilise le canal rouge comme signal 50 } 51 52 return _h(pixelSample); 53 } 54 55 function getWebGLFingerprint() { 56 const canvas = document.createElement("canvas"); 57 const gl = canvas.getContext("webgl") || canvas.getContext("experimental-webgl"); 58 59 if (!gl) return "no-webgl"; 60 61 const debugInfo = gl.getExtension("WEBGL_debug_renderer_info"); 62 63 const vendor = debugInfo ? gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL) : "unknown"; 64 const renderer = debugInfo ? gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL) : "unknown"; 65 66 // Exemple de rendu WebGL simple 67 const shaderPrecision = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT).precision; 68 69 const combined = `vendor=${vendor};renderer=${renderer};precision=${shaderPrecision}`; 70 return _h(combined); 71 } 72 73 var _datas = { 74 "languages":((typeof _nav['language'] == 'undefined')?_nav['language']:_nav['languages'][0]) 75 , "hardwareConcurrency":_nav['hardwareConcurrency'] 76 , "deviceMemory" : _nav['deviceMemory'] 77 , "plugins":_plugins 78 , "userAgent":_nav['userAgent'] 79 , "userAgentBrands":((typeof _nav['userAgentData'] == 'undefined')?_nav['vendor']:_nav['userAgentData']['brands']) 80 , "userAgentMobile":((typeof _nav['userAgentData'] == 'undefined')?((window.matchMedia("(max-width: 767px)").matches)?true:false):_nav['userAgentData']['mobile']) 81 , "userAgentPlateform":((typeof _nav['userAgentData'] == 'undefined')?_nav['platform']:_nav['userAgentData']['platform']) 82 , "platform":_nav['platform'] 83 , "connection":_nav['connection'] 84 , "screenheight": window.screen.height 85 , "screenwidth": window.screen.width 86 , "windowsheight": $(window).height() 87 , "windowswidth": $(window).width() 88 , "mobile":(window.matchMedia("(max-width: 767px)").matches)?true:false 89 , "gpu" : gpu 90 , "gpu_vendor" : gpu_vendor 91 , "webgl" : webgl 92 , "product" : ((typeof _nav['product'] != 'undefined')?_nav['product']:"") 93 , "productSub" : ((typeof _nav['productSub'] != 'undefined')?_nav['productSub']:"") 94 , "appCodeName" : ((typeof _nav['appCodeName'] != 'undefined')?_nav['appCodeName']:"") 95 , "appName" : ((typeof _nav['appName'] != 'undefined')?_nav['appName']:"") 96 , "appVersion" : ((typeof _nav['appVersion'] != 'undefined')?_nav['appVersion']:"") 97 , "cookieEnabled" : ((typeof _nav['cookieEnabled'] != 'undefined')?_nav['cookieEnabled']:"") 98 , "doNotTrack" : ((typeof _nav['doNotTrack'] != 'undefined')?_nav['doNotTrack']:"") 99 , "canevasfp" : getCanvasFingerprint() 100 , "webglfp" : getWebGLFingerprint() 101 //, "dpi": getDpi() 102 }; 103 104 var _visitorId = _h(JSON.stringify(_datas)).toLowerCase(); 105 106 $.ajax({
107 type: "POST", 108 url: "/api/customer/security/?version=2", 109 data: {fp:_visitorId,datas:JSON.stringify(_datas)}, 110 success: function(data){ 111 } 112 }); 113}); 114function _h(d){return rstr2hex(binl2rstr(binl_md5(rstr2binl(d),8*d.length)))}function rstr2hex(d){for(var _,m="0123456789ABCDEF",f="",r=0;r<d.length;r++)_=d.charCodeAt(r),f+=m.charAt(_>>>4&15)+m.charAt(15&_);return f}function rstr2binl(d){for(var _=Array(d.length>>2),m=0;m<_.length;m++)_[m]=0;for(m=0;m<8*d.length;m+=8)_[m>>5]|=(255&d.charCodeAt(m/8))<<m%32;return _}function binl2rstr(d){for(var _="",m=0;m<32*d.length;m+=8)_+=String.fromCharCode(d[m>>5]>>>m%32&255);return _}function binl_md5(d,_){d[_>>5]|=128<<_%32,d[14+(_+64>>>9<<4)]=_;for(var m=1732584193,f=-271733879,r=-1732584194,i=271733878,n=0;n<d.length;n+=16){var h=m,t=f,g=r,e=i;f=md5_ii(f=md5_ii(f=md5_ii(f=md5_ii(f=md5_hh(f=md5_hh(f=md5_hh(f=md5_hh(f=md5_gg(f=md5_gg(f=md5_gg(f=md5_gg(f=md5_ff(f=md5_ff(f=md5_ff(f=md5_ff(f,r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+0],7,-680876936),f,r,d[n+1],12,-389564586),m,f,d[n+2],17,606105819),i,m,d[n+3],22,-1044525330),r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+4],7,-176418897),f,r,d[n+5],12,1200080426),m,f,d[n+6],17,-1473231341),i,m,d[n+7],22,-45705983),r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+8],7,1770035416),f,r,d[n+9],12,-1958414417),m,f,d[n+10],17,-42063),i,m,d[n+11],22,-1990404162),r=md5_ff(r,i=md5_ff(i,m=md5_ff(m,f,r,i,d[n+12],7,1804603682),f,r,d[n+13],12,-40341101),m,f,d[n+14],17,-1502002290),i,m,d[n+15],22,1236535329),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+1],5,-165796510),f,r,d[n+6],9,-1069501632),m,f,d[n+11],14,643717713),i,m,d[n+0],20,-373897302),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+5],5,-701558691),f,r,d[n+10],9,38016083),m,f,d[n+15],14,-660478335),i,m,d[n+4],20,-405537848),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+9],5,568446438),f,r,d[n+14],9,-1019803690),m,f,d[n+3],14,-187363961),i,m,d[n+8],20,1163531501),r=md5_gg(r,i=md5_gg(i,m=md5_gg(m,f,r,i,d[n+13],5,-1444681467),f,r,d[n+2],9,-51403784),m,f,d[n+7],14,1735328473),i,m,d[n+12],20,-1926607734),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+5],4,-378558),f,r,d[n+8],11,-2022574463),m,f,d[n+11],16,1839030562),i,m,d[n+14],23,-35309556),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+1],4,-1530992060),f,r,d[n+4],11,1272893353),m,f,d[n+7],16,-155497632),i,m,d[n+10],23,-1094730640),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+13],4,681279174),f,r,d[n+0],11,-358537222),m,f,d[n+3],16,-722521979),i,m,d[n+6],23,76029189),r=md5_hh(r,i=md5_hh(i,m=md5_hh(m,f,r,i,d[n+9],4,-640364487),f,r,d[n+12],11,-421815835),m,f,d[n+15],16,530742520),i,m,d[n+2],23,-995338651),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+0],6,-198630844),f,r,d[n+7],10,1126891415),m,f,d[n+14],15,-1416354905),i,m,d[n+5],21,-57434055),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+12],6,1700485571),f,r,d[n+3],10,-1894986606),m,f,d[n+10],15,-1051523),i,m,d[n+1],21,-2054922799),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+8],6,1873313359),f,r,d[n+15],10,-30611744),m,f,d[n+6],15,-1560198380),i,m,d[n+13],21,1309151649),r=md5_ii(r,i=md5_ii(i,m=md5_ii(m,f,r,i,d[n+4],6,-145523070),f,r,d[n+11],10,-1120210379),m,f,d[n+2],15,718787259),i,m,d[n+9],21,-343485551),m=safe_add(m,h),f=safe_add(f,t),r=safe_add(r,g),i=safe_add(i,e)}return Array(m,f,r,i)}function md5_cmn(d,_,m,f,r,i){return safe_add(bit_rol(safe_add(safe_add(_,d),safe_add(f,i)),r),m)}function md5_ff(d,_,m,f,r,i,n){return md5_cmn(_&m|~_&f,d,_,r,i,n)}function md5_gg(d,_,m,f,r,i,n){return md5_cmn(_&f|m&~f,d,_,r,i,n)}function md5_hh(d,_,m,f,r,i,n){return md5_cmn(_^m^f,d,_,r,i,n)}function md5_ii(d,_,m,f,r,i,n){return md5_cmn(m^(_|~f),d,_,r,i,n)}function safe_add(d,_){var m=(65535&d)+(65535&_);return(d>>16)+(_>>16)+(m>>16)<<16|65535&m}function bit_rol(d,_){return d<<_|d>>>32-_} 115 116/*function findFirstPositive (f,b=1,d=(e,g,c)=>g<e?-1:0<f(c=e+g>>>1)?c==e||0>=f(c-1)?c:d(e,c-1):d(c+1,g)) { 117 for (;0>=f(b);b<<=1);return d(b>>>1,b)|0 118} 119 120function getDpi() { 121 return findFirstPositive(x => matchMedia(`(max-resolution: ${x}dpi)`).matches); 122}*/
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.