Scripte hinzugefügt.

This commit is contained in:
2026-08-28 18:47:22 +02:00
parent f90abfbdc4
commit 5fc4aa46a6
4 changed files with 333 additions and 0 deletions
+72
View File
@@ -0,0 +1,72 @@
<?php
/**
* blocklist_update.php
* Pflegt eine lokale IP-Sperrliste (PHP-Datei), gespeist aus Honeypot-Treffern
* und/oder manueller Markierung ("IP sperren") in phpList.
* Die Sperrliste wird von config.php bei jedem Seitenaufruf ausgelesen
* (siehe Wiki-Kapitel 8.4 - Lese-Check).
*
* Voraussetzungen:
* - phpList-Attribut "Honeypot" (Text)
* - phpList-Attribut "IP sperren" (Checkbox, manuelle Markierung)
* - phpList-Attribut "IP bereits gesperrt" (Checkbox, Duplikatschutz)
*
* Aufruf: per Cron, z. B. alle 15 Minuten
*/
$dbHost = '127.0.0.1';
$dbName = 'DEINE_DB';
$dbUser = 'DEIN_DB_USER';
$dbPass = 'DEIN_DB_PASSWORT';
$pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUser, $dbPass);
$attrHoneypotId = X;
$attrIpBlockId = Y;
$attrBlockedId = Z;
$blocklistFile = '/pfad/zu/private/ip_blocklist.php';
$sql = "SELECT DISTINCT u.id
FROM phplist_user_user u
LEFT JOIN phplist_user_user_attribute uaip ON uaip.userid = u.id AND uaip.attributeid = :ipBlockId AND uaip.value = 'on'
LEFT JOIN phplist_user_user_attribute uah ON uah.userid = u.id AND uah.attributeid = :honeypotId AND uah.value != ''
LEFT JOIN phplist_user_user_attribute uab ON uab.userid = u.id AND uab.attributeid = :blockedId
WHERE (uaip.value = 'on' OR uah.value IS NOT NULL)
AND (uab.value IS NULL OR uab.value = '')";
$stmt = $pdo->prepare($sql);
$stmt->execute(['ipBlockId' => $attrIpBlockId, 'honeypotId' => $attrHoneypotId, 'blockedId' => $attrBlockedId]);
$candidates = $stmt->fetchAll(PDO::FETCH_COLUMN);
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();
}
$currentBlocklist = file_exists($blocklistFile) ? include $blocklistFile : [];
$newlyBlocked = [];
foreach ($candidates as $userid) {
$ip = getSubscriberIp($pdo, $userid);
if ($ip && !in_array($ip, $currentBlocklist, true)) {
$currentBlocklist[] = $ip;
$newlyBlocked[] = $ip;
}
$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' => $userid, 'aid' => $attrBlockedId]);
}
if (!empty($newlyBlocked)) {
$currentBlocklist = array_values(array_unique($currentBlocklist));
$content = "<?php\nreturn " . var_export($currentBlocklist, true) . ";\n";
file_put_contents($blocklistFile, $content, LOCK_EX);
echo "Neu gesperrt: " . implode(', ', $newlyBlocked) . "\n";
} else {
echo "Keine neuen IPs zu sperren.\n";
}