<?php
// V1712201110
function AdminInformieren($AdminInformieren, $FehlerimSkriptoderSPAM, $AdminEMailAdresse) { // Alle Fehlerausgaben abschalten. error_reporting(0);
// Alle Scriptausgaben nicht direkt an den Client senden. ob_start();
if(($AdminInformieren == TRUE) && (!empty($AdminEMailAdresse))) { mail($AdminEMailAdresse, 'Alarmmeldung vom SPAMAngriffSkript', $FehlerimSkriptoderSPAM, "From: $AdminEMailAdresse"); } return $FehlerimSkriptoderSPAM; }
function SPAMAngriff($SPAMAngriffEinstellungen) { // Einstellungen übernehmen. list($SperrDauer, $WieOftdarfeineIPproTageinenVersuchmachen, $IPSperreDB, $IPSperreDBMaximal, $AdminEMailAdresse, $AdminInformieren) = array_values($SPAMAngriffEinstellungen); // Alle Fehlerausgaben abschalten. error_reporting(0);
// Alle Scriptausgaben nicht direkt an den Client senden. ob_start(); // Fehler Variable auf unbestimmten Fehler (95) setzen. $FehlerimSkriptoderSPAM = 95; // SPAM erst mal per default auf TRUE stellen $SPAM = TRUE;
// Prüfen ob mindestens PHP 5.2.0 vorliegt. if (version_compare(PHP_VERSION, '5.2.0', '<')) { $FehlerimSkriptoderSPAM = 'Fehler im Skript: PHP Version unter 5.2.0'; AdminInformieren($AdminInformieren, $FehlerimSkriptoderSPAM, $AdminEMailAdresse); return $SPAM; }
// Aktueller Zeitstempel. $jetzt = time(); if ($jetzt < 1324038640) { // Dann ist die "Uhr" kaputt -lach-lach-lach $FehlerimSkriptoderSPAM = 'Fehler im Skript: Serveruhr funktioniert nicht richtig'; AdminInformieren($AdminInformieren, $FehlerimSkriptoderSPAM, $AdminEMailAdresse); return $SPAM; } // Zeitsperre auf 24 Stunden setzen $vor24Stunden = $jetzt - (24 * 60 * 60); // *** hier kann zum Testen auf 10 Minuten als Option eingestellt werden // $vor24Stunden = $jetzt - (10 * 60);
// Anwender IP vorerst nur aus REMOTE_ADDR . $AnwenderIP = $_SERVER['REMOTE_ADDR']; if (empty($AnwenderIP)) { // Dann haben wir keine IP. $FehlerimSkriptoderSPAM = 'Fehler im Skript: IP Adresse wird nicht übermittelt'; AdminInformieren($AdminInformieren, $FehlerimSkriptoderSPAM, $AdminEMailAdresse); return $SPAM; } // IPSperreDBMaximal auf MB einstellen. $IPSperreDBMaximal = $IPSperreDBMaximal * 1024 * 1024; // Prüft ob die IPSperre DB Datei vorhanden und kleiner als zulässig ist. if ((!file_exists($IPSperreDB)) || (filesize($IPSperreDB) > $IPSperreDBMaximal)) { $FehlerimSkriptoderSPAM = 'Fehler im Skript: DB Datei nicht vorhanden oder zu groß'; AdminInformieren($AdminInformieren, $FehlerimSkriptoderSPAM, $AdminEMailAdresse); return $SPAM; }
// Aus "einfachen Datenschutzgründen" nur ein md5 der um das letzte Oktett verkürzten IP (IPv4), nicht die IP selber. $AnwenderIPaufgeteilt = explode('.', $AnwenderIP); $AnwenderIPohneletztesOktett = $AnwenderIPaufgeteilt[0] . '.' . $AnwenderIPaufgeteilt[1] . '.' . $AnwenderIPaufgeteilt[2]; $AnwenderIPMD5 = md5($AnwenderIPohneletztesOktett);
// IPSperre DB (Datei) öffnen. if (!$db = sqlite_open($IPSperreDB, 0666, $SQLiteFehler)) { $FehlerimSkriptoderSPAM = "Fehler im Skript: SQL Fehler beim Öffnen der DB: $SQLiteFehler" ; AdminInformieren($AdminInformieren, $FehlerimSkriptoderSPAM, $AdminEMailAdresse); return $SPAM; }
// Einträge die älter als 24 Stunden sind aus der DB löschen. $SQLDatensatz = "DELETE FROM IPSperre WHERE IPBereichsZeitStempel < '" . $vor24Stunden . "';"; $Ergebnis = sqlite_exec($db, $SQLDatensatz, $SQLiteFehler); if (!$Ergebnis) { $FehlerimSkriptoderSPAM = "Fehler im Skript: SQL Fehler beim Löschen der alten Einträge: $SQLiteFehler" ; AdminInformieren($AdminInformieren, $FehlerimSkriptoderSPAM, $AdminEMailAdresse); return $SPAM; }
// Abfragen wie oft ein Anwender mit dieser IP das Skript aufrufen darf. // (MD5, verkürzter IP Bereich in den letzten 24 Stunden.) $SQLDatensatz = "SELECT COUNT(ID) AS WieOftDa FROM IPSperre WHERE IPBereichsMD5='" . $AnwenderIPMD5 . "';"; $Ergebnis = sqlite_query($db, $SQLDatensatz, SQLITE_ASSOC, $SQLiteFehler); if (!$Ergebnis) { $FehlerimSkriptoderSPAM = "Fehler im Skript: SQL Fehler beim Zählen der Einträge: $SQLiteFehler" ; AdminInformieren($AdminInformieren, $FehlerimSkriptoderSPAM, $AdminEMailAdresse); return $SPAM; } $ErgebnisArray = sqlite_fetch_array($Ergebnis); $AnwendermitderIPWieOftDa = $ErgebnisArray['WieOftDa'];
// Abfragen wann ein Anwender mit der IP zuletzt das Skript aufgerufen hat. // (MD5, verkürzter IP Bereich in den letzten 24 Stunden.) $SQLDatensatz = "SELECT MAX(IPBereichsZeitStempel) AS MitderIPZuletzt FROM IPSperre WHERE IPBereichsMD5='" . $AnwenderIPMD5 . "';"; $Ergebnis = sqlite_query($db, $SQLDatensatz, SQLITE_ASSOC, $SQLiteFehler); if (!$Ergebnis) { $FehlerimSkriptoderSPAM = "Fehler im Skript: SQL Fehler beim Ermitteln des letzten letzten Eintrages mit dem IP Bereich: $SQLiteFehler" ; AdminInformieren($AdminInformieren, $FehlerimSkriptoderSPAM, $AdminEMailAdresse); return $SPAM; } $ErgebnisArray = sqlite_fetch_array($Ergebnis); $AnwendermitderIPzuletzt = (int)$ErgebnisArray['MitderIPZuletzt']; $WannWiederOK = $AnwendermitderIPzuletzt + ($SperrDauer * 60);
// Den aktuellen Zugriff auch in die IPSperr DB eintragen. $SQLDatensatz = "INSERT INTO IPSperre (IPBereichsMD5, IPBereichsZeitStempel) VALUES ('" . $AnwenderIPMD5 . "', '" . $jetzt . "');"; $Ergebnis = sqlite_exec($db, $SQLDatensatz, $SQLiteFehler); if (!$Ergebnis) { $FehlerimSkriptoderSPAM = "Fehler im Skript: SQL Fehler beim Eintragen des neuesten Zugriffsversuchs: $SQLiteFehler" ; AdminInformieren($AdminInformieren, $FehlerimSkriptoderSPAM, $AdminEMailAdresse); return $SPAM; }
if (($jetzt >= $WannWiederOK) && ($AnwendermitderIPWieOftDa < $WieOftdarfeineIPproTageinenVersuchmachen)) { $SPAM = FALSE; } return $SPAM; } ?>
|