Tutorials von Thomas Frei-Herrmann





Tutorial für Formular mit mit Datei-Upload und e-Mail Anhang und zusätzliche IP-Sperre

mit Download der Dateien und lest bitte auch die Bemerkungen zu der Sperrung der IPs.

Dieses Tutorial ist nur für fortgeschrittene Anwender gedacht, die sich auch bereits mit PHP vetraut gemacht haben.

Diese Seiten und Skripte sind ausschließlich als Beispiele gedacht und erheben keinen Anspruch sicher zu sein. Ich lehne jegliche Verantwortung für den Nachbau und die Anwendung ausdrücklich ab.
Bitte schützt Euer Upload-Verzeichnis unbedingt mit einer .htaccess Datei.

Hier geht es zum Beispiel dieses Kontakt-Formulars mit Datei-Upload und e-Mail Anhang und IP-Sperre

Zunächst erstellt Ihr Euch mit den NOF-Werkzeugen ein ganz normales Formular.

Bei diesem Formular wird nicht das NOF-eigene Skript “Form Handler (PHP)” unter “Aktion” verwendet, sondern eben ein eigenes Skript. Daher muss unter “Aktion” der Link zu diesem Skript eingetragen werden.

In diesem Beispiel ist das Skript zum Versenden des Formulars ein eigenes Skript, das nicht in NOF eingebunden wird und daher “händisch”, mittels FTP-Programm, auf Euren Server kopiert werden muss. Das Skript selbst (hier “sendmailipsperre.php” genannt) muss dann in den gleichen Ordner kopiert werden, indem sich auch die Seite mit dem Kontakt-Formular befindet. Bitte achtet bei allen Skripten darauf, dass diese mit dem “Windows-Editor” in der Codierung “ANSI” gespeichert werden.


Ihr klickt auf die Schaltfläche “Senden” des Formulars und tragt dort diese Seite “sendmailipsperre.php” ein. Siehe Bild unten.

Die unteren beiden Felder “action” und “zeit” sind verdeckte Felder, die Ihr dort genauso eintragen müsst, denn diese werden im Skript angesprochen. Dazu klickt Ihr jeweils auf die “+” Taste in diesem Fenster und gebt diesen Feldern die Namen und den Wert wie oben im Bild zu erkennen.

Mit dem Feld action (Wert ist send) wird überprüft, ob der “Senden-Button” überhaupt betätigt wurde und nur dann wird das Skript auch abgearbeitet.

Mit dem Feld zeit wird als Wert ein PHP-Befehl übergeben, der die Zeit des Absendens festhält. Dadurch wird im Skript eine dort angegebene Wartezeit überprüft, bevor das Formular gesendet werden kann. Bei manchen Servern kann es notwendig sein den Code mit php einzugeben, denn short_open_tag muss auf “on” gesetzt sein, also so:

<?php echo time();?>


DOWNLOAD:

Hier könnt Ihr Euch die benötigte Datenbank, sowie das benötigte Skript als ZIP-Datei downloaden. Bitte entpackt diese ZIP-Datei. Ihr werdet folgende Ordner vorfinden:
 

  • 1) db - mit der benötigten (noch leeren) SQLite Datenbank IPSperre.DB - für Ordner “db”
    Bitte denkt daran, dass Ihr den Ordner db unbedingt gegen fremden Zugriff schützt
     
  • 2) scripts - mit den beiden benötigten Skripten, sowie einem Skript für den Admin zur Einsicht der DB:

    fh_mailer.php - für den Datei-Anhang an die e-Mail - für Ordner “scripts”
    SpamAngriff.php - das Skript zur Prüfung eines Spam-Angriffs - für Ordner “scripts”
    ipanzeige.php - das Skript zur Einsicht der Datenbank für den Administrator - für Ordner “html”

    Voraussetzung ist das Euer Server PHP 5.2.0 oder höher verarbeiten kann

Letzte Änderung am 18.12.2011
Download Datenbank und Skripte
. Downloads insgesamt seit dem 18.12.2011: 77


Bitte kopiert die Datenbank und die Skripte aus diesen Ordnern in die gleichen Ordner auf Eurem Server, die beide im Stammverzeichnis liegen müssen.

Unten noch eine Ansicht des Skriptes, SpamAngriff.php, das ich oben u.a. zum Download bereitstelle.

<?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; 
}
?>


Bemerkungen:

In der Datenbank wird das letzte Oktett der IP gelöscht, also dann alle IPs ohne dieses letzte Oktett.

Beispiel IP:

AAA.BBB.CCC wird für 24 Stunden gesperrt, wenn die IP z.B. so aussieht: AAA.BBB.CCC.DDD

Es werden also sämtliche IPs ohne das letzte Oktett dann auch gesperrt sein, wenn der Auslöser der Sperre das letzte Oktett DDD war.


Weiterhin stelle ich in meinem Download ein Skript

ipanzeige.php

zur Verfügung, damit der Administrator mal Einsicht in die Datenbank erhält. Dieses Skript kopiert Ihr dann in den Ordner “html” und ruft die URL direkt im Browser auf.

Weiterhin könnt Ihr Euch zur Bearbeitung oder Einsicht der Datenbank dieses kleine Programm

SQLite Administrator hier downloaden.

nach oben

Viel Erfolg !

 

diese Seite weiter empfehlen



Counter Statistik