=') ) { return session_status() === PHP_SESSION_ACTIVE ? TRUE : FALSE; } else { return session_id() === '' ? FALSE : TRUE; } } return FALSE; } // Restlose Ausloeschung einer Session: function session_stop () { // Initialisierung der Session. if (!is_session_started()) session_start(); // Loeschen aller Session-Variablen. $_SESSION = array(); // Session-Cookie loeschen: if (ini_get("session.use_cookies")) { $params = session_get_cookie_params(); setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]); } // Loeschen der Session: session_destroy(); } #### Ab hier Ueberpruefung, ob korrigiert, gesendet oder auf Spam geprueft wird ### #=================================================================================# // Session verfaellt nach 20 Minuten: $session_lifetime = 60*20; if (!is_session_started()) { session_set_cookie_params($session_lifetime); session_start(); } $korrekturaufforderung = 0; $sendeaufforderung = 0; $spamsuspect = 0; $captcha_fail = 0; if (isset($_GET["cmd"])) { if (!empty($_SESSION) AND empty($_POST) AND !isset($_COOKIE["src"])) { if ($_GET["cmd"] == "tocorrect") $korrekturaufforderung = 1; elseif ($_GET["cmd"] == "verified") { $sendeaufforderung = 1; if (isset($_GET["Ergebnis"])) { $beteiligte = explode (" ",$_GET["Beteiligte"]); $korrekt = $beteiligte[1]-$beteiligte[0]; if ($_GET["Ergebnis"] != $korrekt) { $spamsuspect = 1; $captcha_fail = 1; } } } else spamverdacht("Falsches &cmd=... gesendet."); } else { spamverdacht("Missbrauch von ?cmd=verified."); } } #### Ab hier Spam-Ueberpruefung ### #=================================# // Spam-Erkennungs-Cookie: $src = md5(md5(date('zHis'))); // Spam-Umleitung auf Fehlerseite if (isset($_SERVER["HTTPS"])) { if ($_SERVER["HTTPS"] == "on") $error403 = "Location: https://".$_SERVER['HTTP_HOST'].dirname($_SERVER['SCRIPT_NAME'])."/error403.html"; } else { $error403 = "Location: http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['SCRIPT_NAME'])."/error403.html"; } // Aktionen-Buendel, wenn ein Spam-Merkmal entdeckt worden ist: function spamverdacht($grund) { global $error403, $src; if (isset($_SESSION)) session_stop(); setcookie("src", $src, time()+(60*60*24*3000)); // auf 3000 Tage (8 Jahre 2 Monate) gesetzt //header($error403); exit($grund); } if (!$korrekturaufforderung AND !$sendeaufforderung) { // Existiert das Cookie src, ist der Besucher bereits mit Spam aufgefallen. Weg mit ihm: if (isset($_COOKIE["src"])) spamverdacht("src-Cookie gesetzt"); // Keine im Formular eingebaute (hidden) Herkunftsangabe wie "kontakt"(.html) oder "schnellkontakt" - dann ist es Spam: if (empty ($_POST["formfile"])) spamverdacht("Angabe der Herkunftsseite fehlt"); // Ist die Herkunftsangabe: "schnellkontakt" oder "signup.htm"? mit einem evt. Referrer übereinstimmend? Ansonsten ist es Spam: if (isset ($_POST["formfile"]) and $_POST["formfile"] == "schnellkontakt") { $formulardatei = "schnellkontakt.html"; } else { if (isset($_SERVER["HTTP_REFERER"])) { if (basename($_SERVER["HTTP_REFERER"]) == $_POST["formfile"].".html" || basename($_SERVER["HTTP_REFERER"]) == "signup.htm" || basename($_SERVER["HTTP_REFERER"]) == "signup.htm?cmd=tocorrect") { $formulardatei = $_POST["formfile"].".html"; } else { spamverdacht("Gesetzte Herkunftsseite (".$_POST["formfile"].".html) ist gefälscht, wirkliche Herkunft ist ".$_SERVER["HTTP_REFERER"]); } } else { $formulardatei = $_POST["formfile"].".html"; } } // Wenn es die uebermittelte Datei im eigenen DocumentRoot nicht gibt: ist es Spam: if (!file_exists($formulardatei)) spamverdacht("Angebliche Herkunftsseite (".$formulardatei.") existiert nicht"); // Wenn mehr als einmal http(s) irgendwo im Formular vorkommt, ist das sehr verdaechtig, weg damit: if (substr_count($_POST["Nachricht"], "http") > 1) spamverdacht("Link-Spam Nachrichten-Feld"); $spamsuspect = 0; foreach ($_POST as $formularfeld) { if (is_array($formularfeld)) { foreach ($formularfeld as $arrayelement) { if (substr_count($arrayelement, 'http') > 0) $spamsuspect++; } } else { if (substr_count($formularfeld, 'http') > 0) $spamsuspect++; } } if ($spamsuspect > 1) spamverdacht("Link-Spam"); // Wenn die eMail-Adresse Zeilenumbrueche(\n,\r,\t etc.) oder mehr als ein "@" enthaelt, wurde eMail-Injection versucht: Spam: if (substr_count($_POST["eMail-Adresse"], '\\') > 0 || substr_count($_POST["eMail-Adresse"], '@') > 1) spamverdacht("eMail-Injection"); // Wenn der Honeypot "website" irgendetwas enthaelt, ist ein Spammer in die Falle gegangen. Spam: if (!empty($_POST["website"])) spamverdacht("Bot im Honeypot gelandet mit diesem Eintrag: ".$_POST["website"]); // Ein LEERER Spamcheck spc kann auf fehlendes JavaScript hinweisen, darum noch kein Abbruch, // sondern Vormerkung für CAPTCHA. (Ebenso ist dafür vorgemerkt, wer EINEN Link mitsendet, siehe oben.) // Wohl aber ein FALSCHER Spamcheck spc: if (empty($_POST["spc"])) { $spamsuspect = 1; } else { if (!$_POST["spc"] == md5(md5(date('lzDdNWFMmntYy')))) spamverdacht("Spamcheck-Code falsch - statt richtig "".md5(md5(date('lzDdNWFMmntYy')))."" zu schicken, kam "".$_POST["spc"]."""); } } #### Ab hier Feldervalidierung ### #================================# // Diejenigen Felder eines Formulars in $required_fields zusammenstellen, die "required" (PFLICHTFELDER) // und/oder "hidden" (FELDER NICHT FÜR DIE AUGEN DES BESUCHERS) sind. Hidden-Felder dürfen in der // Zusammenstellung aller Eingaben nicht aufgelistet werden: $required_fields = array(); $hidden_fields = array("website"); // Weil "website" nicht "hidden" ist, aber so behandelt so werden soll, ist es voreingetragen. $feld_leer = array(); $pflichtfeld_leer = array(); $to_strip = array('name=', '"'); // Formular-Datei einlesen: if ($korrekturaufforderung || $sendeaufforderung) $formulardatei = $_SESSION["formfile"].".html"; $current = file_get_contents($formulardatei); // Nur das
-Paket herausgreifen: $form_beginn_bis_file_ende = strstr ($current, ""; // Darin alle stoerenden HTML-Angaben beseitigen, bis auf die "-Tags: $formular = strip_tags ($form_beginn_bis_form_ende, ""); // Ein Array mit allen input-Feldern bilden: $formarray = explode("<", $formular); foreach ($formarray as $inputzeile) { if (strpos($inputzeile, "required") || strpos($inputzeile, "hidden")) { // Aus jeder required-Zeile ein Array aus den Eintraegen (class="...", name="...", etc.) bilden: $inputzeilen_teil = explode (" ", $inputzeile); foreach ($inputzeilen_teil as $namensangabe) { // Die Namensangaben herausfiltern (name="..."): if (strpos($namensangabe, "name=") !== false) { // Den jeweiligen Namen ohne 'name="..."' speichern: $extrahierter_name = str_replace($to_strip, "", $namensangabe); // Array mit den Namen der Pflichtfelder aufbauen: if (substr_count($inputzeile, "required")) $required_fields[] = $extrahierter_name; // Nur die Hidden-Felder sammeln, die nicht zu den Check-, Radio- und Selectboxen gehoeren: if (substr_count($inputzeile, "hidden") AND strpos($formular, $extrahierter_name."[]") == false) $hidden_fields[] = $extrahierter_name; } } } } // Code abstreifen, Zeilenumbrueche, Tabulatoren, Leerzeichen: if ($korrekturaufforderung == 1 || $sendeaufforderung == 1) { $empfangen = $_SESSION; } else { $empfangen = $_POST; } $empfangen["eMail-Adresse"] = filter_var($empfangen["eMail-Adresse"], FILTER_SANITIZE_EMAIL); foreach ($empfangen as &$formularfeld) { if (is_array($formularfeld)) { foreach ($formularfeld as &$arrayelement) { $arrayelement = strip_tags(trim($arrayelement)); } } else { $formularfeld = strip_tags(trim($formularfeld)); } } // Array mit ALLEN LEEREN, unausgefuellten Feldern. Inhalte aus Gruppen von Radio-Buttons, Checkboxen und Select-Feldern // werden als Array-Elemente übergeben. Wenn in einer solchen Gruppe *nichts* ausgewaehlt worden ist, wird auch // KEIN Array übergeben, das Element wird schlicht als leer betrachtet. Arrays sind demnach immer mit Inhalt befüllt. // Die blosse Existenz eines Arrays in einem Formularfeld zeigt, dass ausgefuellt worden ist, daher bei Arrays // keine weitere Untersuchung: foreach ($empfangen as $key => $formularfeld) { if (!is_array($formularfeld)) { if (empty($formularfeld)) $feld_leer[] = $key; } } // Welche Pflichtfelder gehoeren zu den leer gebliebenen? foreach ($required_fields as $formularfeld) { $formularfeld = str_replace ("[]","",$formularfeld); // Sub-Felder mit [] am Ende werden sonst nicht gefunden. if (in_array($formularfeld, $feld_leer)) $pflichtfeld_leer[] = $formularfeld; } // Leere Pflichtfelder finden und zur Korrektur vorlegen: if (!empty($pflichtfeld_leer) || $korrekturaufforderung == 1) { if (count($pflichtfeld_leer) == 1) $warnung_im_kopf = 'Die Nachricht konnte noch nicht abgeschickt werden, denn ein wichtiges Feld wurde nicht ausgefüllt. Es ist nachstehend ROT markiert.
'; if (count($pflichtfeld_leer) > 1) $warnung_im_kopf = 'Die Nachricht konnte noch nicht abgeschickt werden, denn wichtige Felder wurden nicht ausgefüllt. Sie sind nachstehend ROT markiert.
'; if ($korrekturaufforderung == 1) $warnung_im_kopf = 'Hier können Sie Ihre Eingaben korrigieren:
'; $current = str_replace("", $warnung_im_kopf, $current); // Im Hintergrund geladene leere Webseite mit den uebergebenen und bereinigten Daten füllen: foreach ($empfangen as $formularfeld => $feldinhalt) { if (!empty($feldinhalt)) { // Bei Radio- und Checkboxen, soweit sie nicht in der Liste der leeren Felder stehen: if (is_array($feldinhalt) AND !in_array($formularfeld, $feld_leer)) { $formularfeld = $formularfeld."[]"; foreach ($feldinhalt as $arrayfeld) { if (!empty($arrayfeld)) { $ohne_wert[] = 'name="'.$formularfeld.'" class="radio" value="'.$arrayfeld.'"'; $mit_wert[] = 'name="'.$formularfeld.'" class="radio" value="'.$arrayfeld.'" checked'; $ohne_wert[] = 'name="'.$formularfeld.'" class="checkbox" value="'.$arrayfeld.'"'; $mit_wert[] = 'name="'.$formularfeld.'" class="checkbox" value="'.$arrayfeld.'" checked'; } } } // Sonderfall Textarea: elseif ($formularfeld == "Nachricht") { $ohne_wert[] = 'placeholder="Meine Nachricht">'; $mit_wert[] = 'placeholder="Meine Nachricht">'.$feldinhalt.''; } // Bei normalen Feldern: else { $ohne_wert[] = 'name="'.$formularfeld.'"'; // Alle Felder ausser "spc" und "website" bekommen aktuelle Werte: if ($formularfeld == "spc" || $formularfeld == "website") { $mit_wert[] = 'name="'.$formularfeld.'"'; } else { $mit_wert[] = 'name="'.$formularfeld.'" value="'.$feldinhalt.'"'; } } } } $current_ausgefuellt = str_replace($ohne_wert, $mit_wert, $current); // Leere Pflichtfelder markieren: $ohne_warnung[] = ""; $mit_warnung[] = ""; foreach ($pflichtfeld_leer as $formularfeld) { $ohne_warnung[] = 'name="'.$formularfeld.'"'; $mit_warnung[] = 'name="'.$formularfeld.'" class="invalid"'; $ohne_warnung[] = 'name="'.$formularfeld.'[]"'; $mit_warnung[] = 'name="'.$formularfeld.'[]" class="invalid"'; } $current_ausgefuellt = str_replace($ohne_warnung, $mit_warnung, $current_ausgefuellt); echo $current_ausgefuellt; exit(); } #### Ab hier Session-Erstellung ### #=================================# else { if (!isset($_SESSION) AND !empty($empfangen)) { session_set_cookie_params($session_lifetime); session_start(); } foreach ($empfangen as $formularfeld => $feldinhalt) { $_SESSION[$formularfeld] = $feldinhalt; } #### Ab hier Darstellung zur Bestaetigung ### #===========================================# $template = file_get_contents("empty.html"); $bestaetigungsseite = ""; $bestaetigungsseite .= '
Das war falsch. Bitte versuchen Sie es noch einmal:
'; $bestaetigungsseite .= '