Files
html/api/deliverscore/scan.php
2026-04-12 22:57:03 +02:00

100 lines
4.0 KiB
PHP

<?php
// DeliverScore Scan API
header("Content-Type: application/json");
header("Access-Control-Allow-Origin: *");
$domain = trim($_GET["domain"] ?? "");
if(!$domain || !preg_match("/^[a-z0-9][a-z0-9.-]+\.[a-z]{2,}$/i", $domain)) {
echo json_encode(["error" => "Domaine invalide"]);
exit;
}
$results = ["domain" => $domain, "score" => 0, "grade" => "F", "checks" => []];
$score = 0;
// SPF
$spf = dns_get_record($domain, DNS_TXT);
$hasSPF = false;
foreach($spf as $r) {
if(isset($r["txt"]) && strpos($r["txt"], "v=spf1") === 0) {
$hasSPF = true;
$results["checks"][] = ["name" => "SPF", "status" => "pass", "value" => $r["txt"], "detail" => "Record SPF valide"];
$score += 20;
break;
}
}
if(!$hasSPF) $results["checks"][] = ["name" => "SPF", "status" => "fail", "value" => "", "detail" => "Aucun record SPF trouvé"];
// DKIM (check common selectors)
$dkimFound = false;
foreach(["default","google","s1","s2","selector1","selector2","k1","dkim"] as $sel) {
$dkim = dns_get_record($sel."._domainkey.".$domain, DNS_TXT);
if(!empty($dkim)) {
$dkimFound = true;
$results["checks"][] = ["name" => "DKIM", "status" => "pass", "value" => $sel, "detail" => "Sélecteur DKIM trouvé: ".$sel];
$score += 20;
break;
}
}
if(!$dkimFound) $results["checks"][] = ["name" => "DKIM", "status" => "warn", "value" => "", "detail" => "Aucun sélecteur DKIM courant trouvé"];
// DMARC
$dmarc = dns_get_record("_dmarc.".$domain, DNS_TXT);
$hasDMARC = false;
foreach($dmarc as $r) {
if(isset($r["txt"]) && strpos($r["txt"], "v=DMARC1") === 0) {
$hasDMARC = true;
$policy = "none";
if(preg_match("/p=(\w+)/", $r["txt"], $m)) $policy = $m[1];
$results["checks"][] = ["name" => "DMARC", "status" => $policy === "reject" ? "pass" : ($policy === "quarantine" ? "pass" : "warn"), "value" => $r["txt"], "detail" => "Policy: ".$policy];
$score += ($policy === "reject" ? 20 : ($policy === "quarantine" ? 15 : 10));
break;
}
}
if(!$hasDMARC) $results["checks"][] = ["name" => "DMARC", "status" => "fail", "value" => "", "detail" => "Aucun record DMARC"];
// MX
$mx = dns_get_record($domain, DNS_MX);
if(!empty($mx)) {
$mxHosts = array_map(function($r){return $r["target"];}, $mx);
$results["checks"][] = ["name" => "MX", "status" => "pass", "value" => implode(", ", $mxHosts), "detail" => count($mx)." MX records"];
$score += 15;
} else {
$results["checks"][] = ["name" => "MX", "status" => "fail", "value" => "", "detail" => "Aucun MX record"];
}
// SSL check
$ctx = stream_context_create(["ssl" => ["verify_peer" => false, "capture_peer_cert" => true]]);
$fp = @stream_socket_client("ssl://".$domain.":443", $errno, $errstr, 5, STREAM_CLIENT_CONNECT, $ctx);
if($fp) {
$results["checks"][] = ["name" => "SSL/TLS", "status" => "pass", "value" => "HTTPS actif", "detail" => "Certificat SSL valide"];
$score += 15;
fclose($fp);
} else {
$results["checks"][] = ["name" => "SSL/TLS", "status" => "warn", "value" => "", "detail" => "HTTPS non détecté"];
}
// Blacklist check (simplified - check a few)
$ip = gethostbyname($domain);
if($ip !== $domain) {
$rev = implode(".", array_reverse(explode(".", $ip)));
$bls = ["zen.spamhaus.org","bl.spamcop.net","b.barracudacentral.org"];
$clean = true;
foreach($bls as $bl) {
if(checkdnsrr($rev.".".$bl, "A")) { $clean = false; break; }
}
$results["checks"][] = ["name" => "Blacklists", "status" => $clean ? "pass" : "fail", "value" => $ip, "detail" => $clean ? "IP propre (3 BL vérifiées)" : "IP blacklistée"];
if($clean) $score += 10;
}
$results["score"] = min(100, $score);
$results["grade"] = $score >= 90 ? "A+" : ($score >= 80 ? "A" : ($score >= 60 ? "B" : ($score >= 40 ? "C" : "F")));
$results["recommendations"] = [];
foreach($results["checks"] as $c) {
if($c["status"] !== "pass") {
$results["recommendations"][] = "Configurer ".$c["name"]." : ".$c["detail"];
}
}
echo json_encode($results, JSON_PRETTY_PRINT);