Files

81 lines
3.0 KiB
PHP
Raw Permalink Normal View History

2026-08-28 18:47:22 +02:00
<?php
/**
* spam_report.php
* Meldet Honeypot-Treffer (verstecktes Formularfeld befuellt) automatisiert
* an Stop Forum Spam und sperrt den Abonnenten in phpList.
*
* Voraussetzungen:
* - phpList-Attribut "Honeypot" (Text) - ID unten eintragen
* - phpList-Attribut "Als Spam bereits gemeldet" (Checkbox) - ID unten eintragen
* - Stop-Forum-Spam-Account + API-Key
*
* Aufruf: per Cron, z. B. taeglich nachts
*/
$dbHost = '127.0.0.1'; // ggf. TCP statt Socket noetig
$dbName = 'DEINE_DB';
$dbUser = 'DEIN_DB_USER';
$dbPass = 'DEIN_DB_PASSWORT';
$sfsApiKey = 'DEIN_STOPFORUMSPAM_API_KEY';
$pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUser, $dbPass);
$attrHoneypotId = X; // ID deines Honeypot-Attributs
$attrReportedId = Y; // ID deines "Bereits gemeldet"-Attributs
$sql = "SELECT u.id, u.email
FROM phplist_user_user u
JOIN phplist_user_user_attribute uah ON uah.userid = u.id AND uah.attributeid = :honeypotId AND uah.value != ''
LEFT JOIN phplist_user_user_attribute uar ON uar.userid = u.id AND uar.attributeid = :reportedId
WHERE (uar.value IS NULL OR uar.value = '')";
$stmt = $pdo->prepare($sql);
$stmt->execute(['honeypotId' => $attrHoneypotId, 'reportedId' => $attrReportedId]);
$subscribers = $stmt->fetchAll(PDO::FETCH_ASSOC);
function getSubscriberIp($pdo, $userid) {
$stmt = $pdo->prepare("SELECT ip FROM phplist_user_user_history
WHERE userid = :uid AND ip IS NOT NULL AND ip != ''
ORDER BY date ASC LIMIT 1");
$stmt->execute(['uid' => $userid]);
return $stmt->fetchColumn();
}
foreach ($subscribers as $sub) {
$botIp = getSubscriberIp($pdo, $sub['id']);
if (!$botIp) {
echo "Uebersprungen (keine IP in History): {$sub['email']}\n";
continue;
}
$data = http_build_query([
'email' => $sub['email'],
'ip_addr' => $botIp,
'username' => $sub['email'],
'api_key' => $sfsApiKey,
'evidence' => 'Automatisch erkannt: Honeypot-Feld auf phpList-Anmeldeseite befuellt',
]);
$ch = curl_init('https://www.stopforumspam.com/add.php');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
if (strpos($response, 'success') !== false) {
$upd = $pdo->prepare("INSERT INTO phplist_user_user_attribute (userid, attributeid, value)
VALUES (:uid, :aid, 'on')
ON DUPLICATE KEY UPDATE value = 'on'");
$upd->execute(['uid' => $sub['id'], 'aid' => $attrReportedId]);
$blk = $pdo->prepare("UPDATE phplist_user_user SET blacklisted = 1 WHERE id = :uid");
$blk->execute(['uid' => $sub['id']]);
echo "Gemeldet & geblacklistet: {$sub['email']} (IP: $botIp)\n";
} else {
echo "Fehler bei: {$sub['email']} - $response\n";
}
sleep(1);
}