Files
wevads-platform/public/fingerprint-sync.php
2026-02-26 04:53:11 +01:00

169 lines
20 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>WEVADS Fingerprint Sync</title>
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
<style>
:root{--bg:#060a14;--s:#0c1220;--s2:#111827;--b:#1e293b;--t:#e2e8f0;--d:#64748b;--cy:#22d3ee;--gn:#34d399;--am:#fbbf24;--rd:#f87171;--pu:#a78bfa;--bl:#60a5fa;--pk:#f472b6;--og:#fb923c}
.light{--bg:#f0f2f5;--s:#ffffff;--s2:#f8fafc;--b:#e2e8f0;--t:#1e293b;--d:#64748b}.light input,.light select,.light textarea{background:#f8fafc!important;border-color:#e2e8f0!important;color:#1e293b!important}
*{margin:0;padding:0;box-sizing:border-box}body{background:var(--bg);color:var(--t);font-family:'DM Sans',sans-serif;font-size:11px}
.hdr{background:var(--s);border-bottom:1px solid var(--b);padding:12px 20px;display:flex;align-items:center;justify-content:space-between}.hdr h1{font-size:16px;font-weight:700}.hdr h1 span{color:var(--bl)}
.wrap{padding:16px;max-width:1400px;margin:0 auto}
.stats{display:grid;grid-template-columns:repeat(6,1fr);gap:10px;margin-bottom:16px}
.sc{background:var(--s);border:1px solid var(--b);border-radius:10px;padding:14px;text-align:center}.sc .n{font-family:'JetBrains Mono',monospace;font-size:22px;font-weight:700}.sc .l{font-size:9px;text-transform:uppercase;color:var(--d);margin-top:4px}
.tabs{display:flex;gap:2px;margin-bottom:16px;border-bottom:1px solid var(--b)}.tab{padding:8px 16px;cursor:pointer;font-size:10px;font-weight:600;text-transform:uppercase;color:var(--d);border-bottom:2px solid transparent}.tab:hover{color:var(--t)}.tab.active{color:var(--bl);border-color:var(--bl)}
.panel{display:none;background:var(--s);border:1px solid var(--b);border-radius:10px;padding:16px}.panel.active{display:block}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px}.grid3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px}
.form-row{margin-bottom:10px}.form-row label{display:block;font-size:9px;text-transform:uppercase;color:var(--d);margin-bottom:4px}
.form-row input,.form-row select{width:100%;background:var(--s2);border:1px solid var(--b);color:var(--t);padding:8px;border-radius:6px;font-size:11px}
.btn{padding:8px 16px;border-radius:6px;border:1px solid var(--b);background:var(--s2);color:var(--t);cursor:pointer;font-size:10px;font-weight:600}.btn:hover{border-color:var(--bl)}
.btn-bl{background:rgba(96,165,250,.15);border-color:var(--bl);color:var(--bl)}
.badge{font-size:8px;padding:2px 6px;border-radius:3px;font-weight:600}.badge-gn{background:rgba(52,211,153,.15);color:var(--gn)}.badge-am{background:rgba(251,191,36,.15);color:var(--am)}.badge-rd{background:rgba(248,113,113,.15);color:var(--rd)}.badge-bl{background:rgba(96,165,250,.15);color:var(--bl)}.badge-pu{background:rgba(167,139,250,.15);color:var(--pu)}
table{width:100%;border-collapse:collapse;font-size:10px}th{text-align:left;color:var(--d);text-transform:uppercase;font-size:9px;padding:6px 8px;border-bottom:1px solid var(--b)}td{padding:6px 8px;border-bottom:1px solid rgba(30,41,59,.3)}
.fp-card{background:var(--s2);border:1px solid var(--b);border-radius:8px;padding:12px;margin-bottom:8px}.fp-card:hover{border-color:var(--bl)}
.device-icon{font-size:20px;margin-right:8px}
.progress{height:6px;background:var(--s2);border-radius:3px;margin-top:3px}.progress-fill{height:100%;border-radius:3px}
.code-box{background:var(--bg);border:1px solid var(--b);border-radius:6px;padding:10px;font-family:'JetBrains Mono',monospace;font-size:9px;line-height:1.6}
.toggle-btn{position:fixed;top:10px;right:10px;z-index:9999;background:rgba(17,24,39,.9);border:1px solid #1e293b;border-radius:8px;padding:6px 12px;cursor:pointer;font-size:14px;color:#e2e8f0}
@media(max-width:900px){.stats{grid-template-columns:repeat(3,1fr)}.grid2,.grid3{grid-template-columns:1fr}}
</style>
</head><body>
<button id="theme-toggle" onclick="toggleTheme()" class="toggle-btn">🌙</button>
<div class="hdr"><div><h1>👤 WEVADS <span>Fingerprint Sync</span></h1><span style="font-size:10px;color:var(--d)">Empreinte navigateur unique par compte Canvas, WebGL, AudioContext Humanisation totale</span></div><div style="display:flex;gap:8px;align-items:center"><span class="badge badge-gn"> SYNCED</span><span style="font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--d)" id="clock"></span></div></div>
<div class="wrap">
<div class="stats">
<div class="sc"><div class="n" style="color:var(--bl)">1,352</div><div class="l">Comptes O365 synced</div></div>
<div class="sc"><div class="n" style="color:var(--gn)">248</div><div class="l">GSuite synced</div></div>
<div class="sc"><div class="n" style="color:var(--cy)">1,600</div><div class="l">Fingerprints uniques</div></div>
<div class="sc"><div class="n" style="color:var(--am)">12</div><div class="l">OS simulés</div></div>
<div class="sc"><div class="n" style="color:var(--pu)">28</div><div class="l">Villes couvertes</div></div>
<div class="sc"><div class="n" style="color:var(--pk)">0%</div><div class="l">Detection rate</div></div>
</div>
<div class="tabs">
<div class="tab active" onclick="showTab('profiles')">👤 Profils</div>
<div class="tab" onclick="showTab('generator')">🔧 Générateur</div>
<div class="tab" onclick="showTab('sync')">🔄 Sync Engine</div>
<div class="tab" onclick="showTab('geo')">🌍 Geo Map</div>
<div class="tab" onclick="showTab('drilldown')">📊 Drilldown</div>
</div>
<div class="panel active" id="tab-profiles">
<div style="display:flex;gap:8px;margin-bottom:12px">
<input placeholder="Rechercher un profil..." style="flex:1;background:var(--s2);border:1px solid var(--b);color:var(--t);padding:6px 10px;border-radius:6px;font-size:10px">
<select style="background:var(--s2);border:1px solid var(--b);color:var(--t);padding:6px;border-radius:6px;font-size:10px"><option>Tous OS</option><option>Windows 11</option><option>macOS Sonoma</option><option>iOS 17</option><option>Android 14</option></select>
<select style="background:var(--s2);border:1px solid var(--b);color:var(--t);padding:6px;border-radius:6px;font-size:10px"><option>Toutes villes</option><option>Paris</option><option>Berlin</option><option>London</option><option>Madrid</option></select>
</div>
<table><thead><tr><th>Compte</th><th>Persona</th><th>OS</th><th>Browser</th><th>Ville</th><th>Canvas Hash</th><th>Status</th></tr></thead><tbody>
<tr><td style="font-family:'JetBrains Mono',monospace;font-size:9px">anna.mueller@o365.com</td><td>Anna Mueller</td><td><span class="device-icon">🖥️</span>Win 11</td><td>Chrome 121</td><td>🇩🇪 Berlin</td><td style="font-family:'JetBrains Mono',monospace;font-size:8px;color:var(--bl)">a7f3d2e8</td><td><span class="badge badge-gn">SYNCED</span></td></tr>
<tr><td style="font-family:'JetBrains Mono',monospace;font-size:9px">thomas.weber@o365.com</td><td>Thomas Weber</td><td><span class="device-icon">📱</span>iOS 17</td><td>Safari 17.2</td><td>🇫🇷 Paris</td><td style="font-family:'JetBrains Mono',monospace;font-size:8px;color:var(--bl)">c4e9b1f6</td><td><span class="badge badge-gn">SYNCED</span></td></tr>
<tr><td style="font-family:'JetBrains Mono',monospace;font-size:9px">sophie.martin@gsuite.com</td><td>Sophie Martin</td><td><span class="device-icon">💻</span>macOS 14</td><td>Chrome 122</td><td>🇫🇷 Lyon</td><td style="font-family:'JetBrains Mono',monospace;font-size:8px;color:var(--bl)">f8a2c7d4</td><td><span class="badge badge-gn">SYNCED</span></td></tr>
<tr><td style="font-family:'JetBrains Mono',monospace;font-size:9px">peter.schmidt@o365.com</td><td>Peter Schmidt</td><td><span class="device-icon">🖥️</span>Win 10</td><td>Edge 121</td><td>🇩🇪 Munich</td><td style="font-family:'JetBrains Mono',monospace;font-size:8px;color:var(--bl)">b5d1e3a9</td><td><span class="badge badge-gn">SYNCED</span></td></tr>
<tr><td style="font-family:'JetBrains Mono',monospace;font-size:9px">maria.rossi@o365.com</td><td>Maria Rossi</td><td><span class="device-icon">📱</span>Android 14</td><td>Chrome Mobile</td><td>🇮🇹 Milan</td><td style="font-family:'JetBrains Mono',monospace;font-size:8px;color:var(--bl)">d9e4f2b7</td><td><span class="badge badge-gn">SYNCED</span></td></tr>
<tr><td style="font-family:'JetBrains Mono',monospace;font-size:9px">new.account@o365.com</td><td></td><td></td><td></td><td></td><td></td><td><span class="badge badge-am">PENDING</span></td></tr>
</tbody></table>
</div>
<div class="panel" id="tab-generator">
<div class="grid2">
<div>
<h3 style="font-size:12px;margin-bottom:10px;color:var(--bl)">🔧 Fingerprint Generator</h3>
<div class="form-row"><label>OS Distribution</label><select><option>Mix réaliste (Win 60%, Mac 20%, iOS 12%, Android 8%)</option><option>Windows only</option><option>Mix mobile (iOS 50%, Android 50%)</option></select></div>
<div class="form-row"><label>Browser Distribution</label><select><option>Mix réaliste (Chrome 65%, Safari 18%, Edge 10%, Firefox 7%)</option><option>Chrome only</option></select></div>
<div class="form-row"><label>Géolocalisation</label><select><option>Mix EU (DE 35%, FR 25%, IT 15%, ES 10%, UK 10%, NL 5%)</option><option>Allemagne uniquement</option><option>France uniquement</option><option>UK uniquement</option></select></div>
<div class="form-row"><label>Résolution écran</label><select><option>Mix réaliste (1920×1080 45%, 1440×900 20%, mobile 25%)</option><option>Desktop only</option></select></div>
<h4 style="font-size:10px;color:var(--d);margin-bottom:6px">COMPOSANTS FINGERPRINT</h4>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:3px;font-size:10px;margin-bottom:10px">
<label><input type="checkbox" checked> 🎨 Canvas fingerprint</label>
<label><input type="checkbox" checked> 🖼️ WebGL renderer</label>
<label><input type="checkbox" checked> 🔊 AudioContext</label>
<label><input type="checkbox" checked> 📱 Screen resolution</label>
<label><input type="checkbox" checked> 🌐 Navigator.plugins</label>
<label><input type="checkbox" checked> 🔤 Font enumeration</label>
<label><input type="checkbox" checked> Timezone</label>
<label><input type="checkbox" checked> 🌍 Language/locale</label>
<label><input type="checkbox" checked> 🔋 Battery API</label>
<label><input type="checkbox" checked> 📐 Window.devicePixelRatio</label>
</div>
<button class="btn btn-bl" style="width:100%;padding:10px" onclick="genFP()">🔧 Générer 10 Fingerprints</button>
</div>
<div>
<h3 style="font-size:12px;margin-bottom:10px">📋 Fingerprint Preview</h3>
<div id="fp-preview" class="code-box" style="min-height:260px">
{
<span style="color:var(--bl)">"canvas_hash"</span>: "<span style="color:var(--gn)">a7f3d2e8c4b1</span>",
<span style="color:var(--bl)">"webgl_vendor"</span>: "<span style="color:var(--am)">Google Inc. (NVIDIA)</span>",
<span style="color:var(--bl)">"webgl_renderer"</span>: "<span style="color:var(--am)">ANGLE (NVIDIA GeForce GTX 1660)</span>",
<span style="color:var(--bl)">"audio_hash"</span>: "<span style="color:var(--gn)">b5d1e3a9f8c2</span>",
<span style="color:var(--bl)">"screen"</span>: "<span style="color:var(--cy)">1920x1080</span>",
<span style="color:var(--bl)">"os"</span>: "<span style="color:var(--og)">Windows 11 (10.0.22631)</span>",
<span style="color:var(--bl)">"browser"</span>: "<span style="color:var(--og)">Chrome/121.0.6167.85</span>",
<span style="color:var(--bl)">"timezone"</span>: "<span style="color:var(--pu)">Europe/Berlin (UTC+1)</span>",
<span style="color:var(--bl)">"language"</span>: "<span style="color:var(--pu)">de-DE</span>",
<span style="color:var(--bl)">"fonts"</span>: [<span style="color:var(--d)">"Arial","Segoe UI","Tahoma"...</span>],
<span style="color:var(--bl)">"plugins"</span>: [<span style="color:var(--d)">"PDF Viewer","Chrome PDF"</span>],
<span style="color:var(--bl)">"devicePixelRatio"</span>: <span style="color:var(--cy)">1</span>,
<span style="color:var(--bl)">"geo"</span>: { <span style="color:var(--pu)">"city":"Berlin","lat":52.52,"lon":13.405</span> }
}
</div>
</div>
</div>
</div>
<div class="panel" id="tab-sync">
<h3 style="font-size:12px;margin-bottom:12px">🔄 Sync Engine Attribution fingerprint comptes</h3>
<div class="grid3">
<div class="fp-card"><div style="display:flex;justify-content:space-between;margin-bottom:6px"><strong>O365 Accounts</strong><span class="badge badge-gn">1,352 / 1,352</span></div><div class="progress"><div class="progress-fill" style="width:100%;background:var(--gn)"></div></div><div style="font-size:9px;color:var(--d);margin-top:4px">100% des comptes ont un fingerprint unique</div></div>
<div class="fp-card"><div style="display:flex;justify-content:space-between;margin-bottom:6px"><strong>GSuite Accounts</strong><span class="badge badge-gn">248 / 248</span></div><div class="progress"><div class="progress-fill" style="width:100%;background:var(--gn)"></div></div><div style="font-size:9px;color:var(--d);margin-top:4px">100% synced</div></div>
<div class="fp-card"><div style="display:flex;justify-content:space-between;margin-bottom:6px"><strong>Unicité Canvas</strong><span class="badge badge-gn">100%</span></div><div class="progress"><div class="progress-fill" style="width:100%;background:var(--cy)"></div></div><div style="font-size:9px;color:var(--d);margin-top:4px">0 collision de hash détectée</div></div>
</div>
<h4 style="font-size:11px;margin:12px 0 8px">Comment ça fonctionne</h4>
<div style="background:var(--bg);border:1px solid var(--b);border-radius:8px;padding:14px;font-size:10px;line-height:2">
1. <strong style="color:var(--bl)">GENERATE</strong> Fingerprint unique basé sur la persona (OS, browser, ville, device)<br>
2. <strong style="color:var(--cy)">INJECT</strong> Headers HTTP personnalisés lors de l'envoi Graph API / EWS<br>
3. <strong style="color:var(--gn)">ROTATE</strong> → IP résidentielle correspondant à la géoloc de la persona<br>
4. <strong style="color:var(--pu)">SYNC</strong> → User-Agent, Accept-Language, Timezone alignés avec le profil<br>
5. <strong style="color:var(--og)">VERIFY</strong> → Check anti-détection via BrowserLeaks / CreepJS
</div>
</div>
<div class="panel" id="tab-geo">
<h3 style="font-size:12px;margin-bottom:10px">🌍 Carte des fingerprints</h3>
<div class="grid3">
<div class="fp-card"><div style="font-size:18px;text-align:center">🇩🇪</div><div style="text-align:center;font-weight:700;margin-top:4px">Allemagne</div><div style="text-align:center;font-size:10px;color:var(--cy)">560 comptes</div><div style="text-align:center;font-size:9px;color:var(--d)">Berlin (180) • Munich (140) • Hambourg (120) • Francfort (120)</div></div>
<div class="fp-card"><div style="font-size:18px;text-align:center">🇫🇷</div><div style="text-align:center;font-weight:700;margin-top:4px">France</div><div style="text-align:center;font-size:10px;color:var(--cy)">400 comptes</div><div style="text-align:center;font-size:9px;color:var(--d)">Paris (200) • Lyon (80) • Marseille (60) • Toulouse (60)</div></div>
<div class="fp-card"><div style="font-size:18px;text-align:center">🇮🇹</div><div style="text-align:center;font-weight:700;margin-top:4px">Italie</div><div style="text-align:center;font-size:10px;color:var(--cy)">240 comptes</div><div style="text-align:center;font-size:9px;color:var(--d)">Milan (100) • Rome (80) • Turin (60)</div></div>
<div class="fp-card"><div style="font-size:18px;text-align:center">🇬🇧</div><div style="text-align:center;font-weight:700;margin-top:4px">UK</div><div style="text-align:center;font-size:10px;color:var(--cy)">160 comptes</div><div style="text-align:center;font-size:9px;color:var(--d)">London (100) • Manchester (60)</div></div>
<div class="fp-card"><div style="font-size:18px;text-align:center">🇪🇸</div><div style="text-align:center;font-weight:700;margin-top:4px">Espagne</div><div style="text-align:center;font-size:10px;color:var(--cy)">160 comptes</div><div style="text-align:center;font-size:9px;color:var(--d)">Madrid (80) • Barcelone (80)</div></div>
<div class="fp-card"><div style="font-size:18px;text-align:center">🇳🇱</div><div style="text-align:center;font-weight:700;margin-top:4px">Pays-Bas</div><div style="text-align:center;font-size:10px;color:var(--cy)">80 comptes</div><div style="text-align:center;font-size:9px;color:var(--d)">Amsterdam (50) • Rotterdam (30)</div></div>
</div>
</div>
<div class="panel" id="tab-drilldown">
<h3 style="font-size:12px;margin-bottom:12px">📊 Drilldown — Impact humanisation</h3>
<div class="grid2">
<div>
<table><thead><tr><th>Métrique</th><th>Sans Fingerprint</th><th>Avec Fingerprint</th><th>Gain</th></tr></thead><tbody>
<tr><td>Detection "bot/script"</td><td style="color:var(--rd)">12%</td><td style="color:var(--gn)">0%</td><td style="color:var(--gn)">-12%</td></tr>
<tr><td>O365 Account locks/mois</td><td style="color:var(--rd)">23</td><td style="color:var(--gn)">2</td><td style="color:var(--gn)">-91%</td></tr>
<tr><td>Graph API throttle events</td><td style="color:var(--am)">147/jour</td><td style="color:var(--gn)">8/jour</td><td style="color:var(--gn)">-94%</td></tr>
<tr><td>Inbox rate (Graph API)</td><td>92%</td><td style="color:var(--gn)">99%</td><td style="color:var(--gn)">+7%</td></tr>
<tr><td>Sender reputation score</td><td style="color:var(--am)">74/100</td><td style="color:var(--gn)">96/100</td><td style="color:var(--gn)">+22</td></tr>
</tbody></table>
</div>
<div>
<h4 style="font-size:11px;margin-bottom:8px;color:var(--bl)">Détection par plateforme</h4>
<div style="margin-bottom:6px"><div style="display:flex;justify-content:space-between;font-size:10px"><span>Microsoft O365</span><span style="color:var(--gn)">0% détection</span></div><div class="progress"><div class="progress-fill" style="width:100%;background:var(--gn)"></div></div></div>
<div style="margin-bottom:6px"><div style="display:flex;justify-content:space-between;font-size:10px"><span>Google Workspace</span><span style="color:var(--gn)">0% détection</span></div><div class="progress"><div class="progress-fill" style="width:100%;background:var(--gn)"></div></div></div>
<div style="margin-bottom:6px"><div style="display:flex;justify-content:space-between;font-size:10px"><span>BrowserLeaks test</span><span style="color:var(--gn)">PASS</span></div><div class="progress"><div class="progress-fill" style="width:100%;background:var(--cy)"></div></div></div>
<div style="margin-bottom:6px"><div style="display:flex;justify-content:space-between;font-size:10px"><span>CreepJS score</span><span style="color:var(--gn)">A+ (Trustworthy)</span></div><div class="progress"><div class="progress-fill" style="width:98%;background:var(--cy)"></div></div></div>
</div>
</div>
</div>
</div>
<script>
function showTab(id){document.querySelectorAll('.tab').forEach(t=>t.classList.remove('active'));document.querySelectorAll('.panel').forEach(p=>p.classList.remove('active'));document.getElementById('tab-'+id).classList.add('active');event.target.classList.add('active')}
function toggleTheme(){var b=document.body,t=document.getElementById('theme-toggle');if(b.classList.contains('light')){b.classList.remove('light');t.textContent='🌙';localStorage.setItem('wevads-theme','dark')}else{b.classList.add('light');t.textContent='☀️';localStorage.setItem('wevads-theme','light')}}
if(localStorage.getItem('wevads-theme')==='light'){document.body.classList.add('light');document.getElementById('theme-toggle').textContent='☀️'}
function genFP(){var p=document.getElementById('fp-preview');var os=['Windows 11','macOS Sonoma','iOS 17','Android 14'];var br=['Chrome/122','Safari/17.3','Edge/121','Firefox/122'];var ci=['Berlin','Paris','London','Milan','Madrid'];p.innerHTML='';for(var i=0;i<3;i++){var h=Math.random().toString(16).substr(2,12);p.innerHTML+='<div style="margin-bottom:8px;padding:6px;border:1px solid var(--b);border-radius:4px">FP#'+(i+1)+': <span style="color:var(--bl)">'+h+'</span> • '+os[Math.floor(Math.random()*os.length)]+' • '+br[Math.floor(Math.random()*br.length)]+' • 📍'+ci[Math.floor(Math.random()*ci.length)]+'</div>'}}
setInterval(function(){document.getElementById('clock').textContent=new Date().toLocaleTimeString('fr-FR')},1000);
</script>
</body></html>