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: 72


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