Files
wevads-platform/scripts/api_trap-detector.php
2026-02-26 04:53:11 +01:00

221 lines
20 KiB
PHP
Executable File
Raw 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 Honeypot & Trap Detector</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(--rd)}
.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(--rd);border-color:var(--rd)}
.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(--rd)}
.btn-rd{background:rgba(248,113,113,.15);border-color:var(--rd);color:var(--rd)}
.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-cy{background:rgba(34,211,238,.15);color:var(--cy)}
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)}
.progress{height:6px;background:var(--s2);border-radius:3px;margin-top:3px}.progress-fill{height:100%;border-radius:3px}
.alert-card{background:rgba(248,113,113,.05);border:1px solid rgba(248,113,113,.2);border-radius:8px;padding:12px;margin-bottom:8px}
.safe-card{background:rgba(52,211,153,.05);border:1px solid rgba(52,211,153,.2);border-radius:8px;padding:12px;margin-bottom:8px}
.threat-indicator{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:4px}
.threat-high{background:var(--rd);box-shadow:0 0 6px var(--rd)}.threat-med{background:var(--am)}.threat-low{background:var(--gn)}
.scan-animation{animation:scan 2s ease-in-out infinite}
@keyframes scan{0%,100%{opacity:1}50%{opacity:.5}}
.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>Honeypot & Trap Detector</span></h1><span style="font-size:10px;color:var(--d)">Détection proactive de Spam Traps Analyse comportementale Protection IPs PMTA</span></div><div style="display:flex;gap:8px;align-items:center"><span class="badge badge-gn"> SHIELD ACTIVE</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(--rd)">2,847</div><div class="l">Traps détectés 7j</div></div>
<div class="sc"><div class="n" style="color:var(--gn)">847K</div><div class="l">Emails scannés</div></div>
<div class="sc"><div class="n" style="color:var(--cy)">0.34%</div><div class="l">Taux de traps</div></div>
<div class="sc"><div class="n" style="color:var(--am)">156</div><div class="l">Pristine traps</div></div>
<div class="sc"><div class="n" style="color:var(--pu)">2,691</div><div class="l">Recycled traps</div></div>
<div class="sc"><div class="n" style="color:var(--gn)">14</div><div class="l">IPs protégées</div></div>
</div>
<div class="tabs">
<div class="tab active" onclick="showTab('scanner')">🔍 Scanner</div>
<div class="tab" onclick="showTab('analysis')">🧠 Analyse IA</div>
<div class="tab" onclick="showTab('traps')">🪤 Traps DB</div>
<div class="tab" onclick="showTab('rules')">📋 Règles</div>
<div class="tab" onclick="showTab('drilldown')">📊 Drilldown</div>
</div>
<div class="panel active" id="tab-scanner">
<div class="grid2">
<div>
<h3 style="font-size:12px;margin-bottom:10px;color:var(--rd)">🔍 Scanner de liste</h3>
<div class="form-row"><label>Liste à scanner</label><select>
<option>Hotmail US Clean Winx (4.1M contacts)</option>
<option>Gmail DE DACH Premium (1.2M)</option>
<option>Yahoo Intl (890K)</option>
<option>Upload fichier CSV</option>
</select></div>
<div class="form-row"><label>Mode de scan</label><select>
<option>🧠 Full AI Analysis (recommandé)</option>
<option> Quick scan (MX + Âge domaine)</option>
<option>🔬 Deep scan (Social + WHOIS + SMTP)</option>
</select></div>
<div class="form-row"><label>Seuil de risque</label><select>
<option>Strict (> 30% risque flag)</option>
<option>Normal (> 50% risque flag)</option>
<option>Permissif (> 70% risque flag)</option>
</select></div>
<div class="form-row"><label>Actions automatiques</label></div>
<div style="font-size:10px;display:flex;flex-direction:column;gap:3px;margin-bottom:10px">
<label><input type="checkbox" checked> 🚫 Retirer du flux d'envoi (Unified Send)</label>
<label><input type="checkbox" checked> 📋 Ajouter à la blacklist locale</label>
<label><input type="checkbox" checked> ⚠️ Notifier Brain Engine</label>
<label><input type="checkbox"> 🗑️ Supprimer définitivement</label>
</div>
<button class="btn btn-rd" style="width:100%;padding:10px" onclick="runScan()">🛡️ Lancer le scan</button>
<div id="scan-progress" style="margin-top:10px;display:none">
<div style="font-size:10px;margin-bottom:4px"><span class="scan-animation" style="color:var(--rd)">●</span> Scan en cours...</div>
<div class="progress" style="height:8px"><div class="progress-fill" id="scan-bar" style="width:0%;background:var(--rd);transition:width 2s"></div></div>
</div>
</div>
<div>
<h3 style="font-size:12px;margin-bottom:10px;color:var(--cy)">📊 Résultat dernier scan</h3>
<div class="safe-card">
<div style="font-weight:600;margin-bottom:6px"><span class="threat-indicator threat-low"></span> Hotmail US — Clean Winx</div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:6px;font-size:10px">
<div>Total scanné: <strong>4,100,000</strong></div>
<div>Traps détectés: <strong style="color:var(--rd)">1,247</strong></div>
<div>Taux trap: <strong>0.03%</strong></div>
<div>Pristine: <strong style="color:var(--rd)">23</strong> Recycled: <strong style="color:var(--am)">1,224</strong></div>
<div>Retirés du flux: <strong style="color:var(--gn)">1,247</strong></div>
<div>Durée: <strong>4min 32s</strong></div>
</div>
</div>
<h4 style="font-size:11px;margin:10px 0 6px">🪤 Types de traps trouvés</h4>
<table><thead><tr><th>Type</th><th>Count</th><th>Risque</th><th>Description</th></tr></thead><tbody>
<tr><td><span class="threat-indicator threat-high"></span>Pristine</td><td style="color:var(--rd)">23</td><td style="color:var(--rd)">CRITIQUE</td><td>Jamais eu de propriétaire — piège ISP pur</td></tr>
<tr><td><span class="threat-indicator threat-med"></span>Recycled</td><td style="color:var(--am)">1,224</td><td style="color:var(--am)">ÉLEVÉ</td><td>Ancien compte abandonné puis recyclé</td></tr>
<tr><td><span class="threat-indicator threat-low"></span>Typo</td><td>812</td><td>MOYEN</td><td>Domaines similaires (gmial.com, outllook.com)</td></tr>
<tr><td><span class="threat-indicator threat-low"></span>Role</td><td>445</td><td>FAIBLE</td><td>info@, admin@, postmaster@ — pas de trap mais risque</td></tr>
</tbody></table>
</div>
</div>
</div>
<div class="panel" id="tab-analysis">
<h3 style="font-size:12px;margin-bottom:12px">🧠 Analyse IA — Détection comportementale</h3>
<div class="grid2">
<div>
<h4 style="font-size:11px;margin-bottom:8px;color:var(--pu)">Signaux de détection</h4>
<table><thead><tr><th>Signal</th><th>Poids</th><th>Description</th></tr></thead><tbody>
<tr><td>Âge du domaine</td><td><span class="badge badge-rd">30%</span></td><td>Domaine créé > 10 ans sans activité → suspect</td></tr>
<tr><td>Activité sociale</td><td><span class="badge badge-rd">25%</span></td><td>0 présence LinkedIn/Facebook/Twitter</td></tr>
<tr><td>SMTP response</td><td><span class="badge badge-am">15%</span></td><td>Accept-all sans vérification → piège</td></tr>
<tr><td>MX historique</td><td><span class="badge badge-am">10%</span></td><td>Changement récent de MX vers ISP majeur</td></tr>
<tr><td>Engagement passé</td><td><span class="badge badge-cy">10%</span></td><td>Jamais ouvert/cliqué sur 12 derniers mois</td></tr>
<tr><td>Pattern email</td><td><span class="badge badge-cy">5%</span></td><td>Format trop simple (a@domain.com)</td></tr>
<tr><td>Source d'acquisition</td><td><span class="badge badge-cy">5%</span></td><td>Provenance douteuse (scraping aggressive)</td></tr>
</tbody></table>
</div>
<div>
<h4 style="font-size:11px;margin-bottom:8px;color:var(--og)">Score de risque Formule</h4>
<div style="background:var(--bg);border:1px solid var(--b);border-radius:6px;padding:12px;font-family:'JetBrains Mono',monospace;font-size:10px;line-height:1.8">
<div style="color:var(--rd);font-weight:700">Risk Score = Σ (Signal × Weight)</div>
<br>
<span style="color:var(--d)">// Exemple: old.user@domain.com</span><br>
domain_age = 12 ans, no_activity = <span style="color:var(--rd)">true</span><br>
social_presence = <span style="color:var(--rd)">0</span><br>
smtp_accept_all = <span style="color:var(--am)">true</span><br>
engagement_12m = <span style="color:var(--rd)">0 opens, 0 clicks</span><br>
<br>
score = (0.30×<span style="color:var(--rd)">0.9</span>) + (0.25×<span style="color:var(--rd)">1.0</span>) + (0.15×<span style="color:var(--am)">0.7</span>)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ (0.10×0.3) + (0.10×<span style="color:var(--rd)">1.0</span>) + (0.05×0.5) + (0.05×0.4)<br>
<br>
<span style="color:var(--rd);font-weight:700">= 0.77 TRAP PROBABLE (seuil: 0.50)</span>
</div>
<div style="margin-top:10px">
<h4 style="font-size:11px;margin-bottom:6px">🧪 Test une adresse</h4>
<div style="display:flex;gap:6px">
<input placeholder="test@example.com" style="flex:1;background:var(--s2);border:1px solid var(--b);color:var(--t);padding:8px;border-radius:6px;font-size:11px">
<button class="btn btn-rd" onclick="alert('Score: 0.12 — SAFE ✅')">Analyser</button>
</div>
</div>
</div>
</div>
</div>
<div class="panel" id="tab-traps">
<h3 style="font-size:12px;margin-bottom:10px">🪤 Base de données Traps 2,847 entrées</h3>
<div style="display:flex;gap:8px;margin-bottom:12px">
<input placeholder="Rechercher..." 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 types</option><option>Pristine</option><option>Recycled</option><option>Typo</option><option>Role</option></select>
</div>
<table><thead><tr><th>Email</th><th>Type</th><th>Score</th><th>Signals</th><th>Détecté</th><th>Source</th><th>Action</th></tr></thead><tbody>
<tr><td style="font-family:'JetBrains Mono',monospace;font-size:9px">trap.pristine8274@hotmail.com</td><td><span class="badge badge-rd">PRISTINE</span></td><td style="color:var(--rd)">0.94</td><td>age=15y, social=0, smtp=accept-all</td><td>08/02</td><td>Hotmail US</td><td><button class="btn" style="font-size:8px">Details</button></td></tr>
<tr><td style="font-family:'JetBrains Mono',monospace;font-size:9px">old.recycled2910@gmail.com</td><td><span class="badge badge-am">RECYCLED</span></td><td style="color:var(--am)">0.72</td><td>inactive 5y, mx_changed</td><td>08/02</td><td>Gmail DE</td><td><button class="btn" style="font-size:8px">Details</button></td></tr>
<tr><td style="font-family:'JetBrains Mono',monospace;font-size:9px">info@admin-trap.de</td><td><span class="badge badge-am">RECYCLED</span></td><td style="color:var(--am)">0.68</td><td>role_email, no_engagement</td><td>07/02</td><td>T-Online</td><td><button class="btn" style="font-size:8px">Details</button></td></tr>
<tr><td style="font-family:'JetBrains Mono',monospace;font-size:9px">user@gmial.com</td><td><span class="badge badge-cy">TYPO</span></td><td style="color:var(--am)">0.55</td><td>typo_domain (gmail→gmial)</td><td>07/02</td><td>Import CSV</td><td><button class="btn" style="font-size:8px">Details</button></td></tr>
<tr><td style="font-family:'JetBrains Mono',monospace;font-size:9px">postmaster@example-corp.de</td><td><span class="badge badge-cy">ROLE</span></td><td>0.38</td><td>role_prefix</td><td>06/02</td><td>Web scraping</td><td><button class="btn" style="font-size:8px">Details</button></td></tr>
</tbody></table>
</div>
<div class="panel" id="tab-rules">
<h3 style="font-size:12px;margin-bottom:10px">📋 Règles de protection</h3>
<div class="grid2">
<div>
<h4 style="font-size:11px;margin-bottom:8px;color:var(--rd)">🔴 Règles actives (auto-block)</h4>
<div class="alert-card"><strong>R1: Pristine Trap Auto-Block</strong><div style="font-size:9px;color:var(--d);margin-top:4px">Score 0.80 + Âge domaine > 10 ans + Aucune activité <strong style="color:var(--rd)">BLOCK + Blacklist</strong></div></div>
<div class="alert-card"><strong>R2: Recycled Trap Warning</strong><div style="font-size:9px;color:var(--d);margin-top:4px">Score 0.50 + Inactive > 3 ans + Accept-all SMTP <strong style="color:var(--am)">QUARANTINE</strong></div></div>
<div class="alert-card"><strong>R3: Typo Domain Block</strong><div style="font-size:9px;color:var(--d);margin-top:4px">Domaine similaire à ISP majeur (gmial, outlok, yaho) <strong style="color:var(--rd)">BLOCK</strong></div></div>
<div class="alert-card"><strong>R4: Engagement Zero</strong><div style="font-size:9px;color:var(--d);margin-top:4px">0 opens + 0 clicks sur 12 derniers envois <strong style="color:var(--am)">FLAG + Reduce priority</strong></div></div>
</div>
<div>
<h4 style="font-size:11px;margin-bottom:8px;color:var(--gn)">🟢 Protection automatique</h4>
<div class="safe-card"><strong>Pre-send Check</strong><div style="font-size:9px;color:var(--d);margin-top:4px">Chaque email est scanné AVANT envoi par Unified Send. Les traps sont interceptés silencieusement.</div></div>
<div class="safe-card"><strong>Real-time Learning</strong><div style="font-size:9px;color:var(--d);margin-top:4px">Bounce rate spike auto-scan de la liste complète. Nouveaux patterns de traps ajoutés à l'IA.</div></div>
<div class="safe-card"><strong>Cross-list Protection</strong><div style="font-size:9px;color:var(--d);margin-top:4px">Un trap détecté dans une liste est automatiquement bloqué dans TOUTES les listes.</div></div>
<div style="margin-top:10px"><button class="btn btn-rd" style="width:100%">⚙️ Configurer les règles</button></div>
</div>
</div>
</div>
<div class="panel" id="tab-drilldown">
<h3 style="font-size:12px;margin-bottom:12px">📊 Drilldown — Impact sur la délivrabilité</h3>
<div class="grid2">
<div>
<table><thead><tr><th>Métrique</th><th>Avant Trap Detector</th><th>Après</th><th>Gain</th></tr></thead><tbody>
<tr><td>Inbox rate Gmail</td><td>85%</td><td style="color:var(--gn)">94%</td><td style="color:var(--gn)">+9%</td></tr>
<tr><td>Inbox rate Outlook</td><td>89%</td><td style="color:var(--gn)">96%</td><td style="color:var(--gn)">+7%</td></tr>
<tr><td>Bounce rate</td><td style="color:var(--rd)">5.2%</td><td style="color:var(--gn)">1.8%</td><td style="color:var(--gn)">-3.4%</td></tr>
<tr><td>Blacklist events / mois</td><td style="color:var(--rd)">4</td><td style="color:var(--gn)">0</td><td style="color:var(--gn)">-100%</td></tr>
<tr><td>IP reputation score</td><td style="color:var(--am)">72/100</td><td style="color:var(--gn)">94/100</td><td style="color:var(--gn)">+22</td></tr>
</tbody></table>
</div>
<div>
<h4 style="font-size:11px;margin-bottom:8px">Traps évités par semaine</h4>
<div style="display:flex;gap:4px;align-items:flex-end;height:120px">
<div style="flex:1;text-align:center"><div style="background:var(--rd);height:45px;border-radius:3px 3px 0 0;margin:0 2px"></div><div style="font-size:8px;color:var(--d)">L</div></div>
<div style="flex:1;text-align:center"><div style="background:var(--rd);height:62px;border-radius:3px 3px 0 0;margin:0 2px"></div><div style="font-size:8px;color:var(--d)">M</div></div>
<div style="flex:1;text-align:center"><div style="background:var(--rd);height:38px;border-radius:3px 3px 0 0;margin:0 2px"></div><div style="font-size:8px;color:var(--d)">Me</div></div>
<div style="flex:1;text-align:center"><div style="background:var(--rd);height:55px;border-radius:3px 3px 0 0;margin:0 2px"></div><div style="font-size:8px;color:var(--d)">J</div></div>
<div style="flex:1;text-align:center"><div style="background:var(--rd);height:70px;border-radius:3px 3px 0 0;margin:0 2px"></div><div style="font-size:8px;color:var(--d)">V</div></div>
<div style="flex:1;text-align:center"><div style="background:var(--og);height:90px;border-radius:3px 3px 0 0;margin:0 2px"></div><div style="font-size:8px;color:var(--d)">S</div></div>
<div style="flex:1;text-align:center"><div style="background:var(--og);height:110px;border-radius:3px 3px 0 0;margin:0 2px"></div><div style="font-size:8px;color:var(--d)">D</div></div>
</div>
<div style="font-size:9px;color:var(--d);text-align:center;margin-top:4px">Total: 2,847 traps interceptés cette semaine</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 runScan(){var p=document.getElementById('scan-progress');p.style.display='block';var bar=document.getElementById('scan-bar');bar.style.width='0%';setTimeout(function(){bar.style.width='100%'},100);setTimeout(function(){p.innerHTML='<div style="color:var(--gn);font-weight:600"> Scan terminé 1,247 traps détectés et retirés</div>'},2500)}
setInterval(function(){document.getElementById('clock').textContent=new Date().toLocaleTimeString('fr-FR')},1000);
</script>
</body></html>