PHP / Tipps / IP basierte Floodsperre

von: Werner Zenk

Um das Flooden (= Zumüllen mit großen Mengen meist sinnlosen Inhalts) von Foren und Gästebüchern etc. zu erschweren oder um zu verhindern das nach dem absenden des Formulars und drücken der F5-Taste die Daten nochmals eingetragen werden, kann die hier vorgestellte Floodsperre einen Schutz bieten.

 

Demo:
Innerhalb der Sperrzeit kann das Formular vom selben Benutzer nicht mehrmals gesendet werden. In diesem Demo ist eine Sperrzeit von 10 Sekunden aktiv.

 

Die IP-Adresse und das Datum werden in einer Datei ("floodsperre.dat") gespeichert. Damit die Datei nicht unendlich groß wird, werden nur die letzten zehn Einträge (kann eingestellt werden) beibehalten.
Machen Sie die Sperrzeit nicht zu lang, das verärgert nur die Benutzer
Es muss nicht unbedingt ein Hinweis auf eine (kurze) Sperrzeit ausgegeben werden.

 

Quelltext:floodsperre.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<!DOCTYPE html>
<html>
 <head>
  <title>IP basierte Floodsperre - Demo</title>
 </head>
<body>

<form action="" method="post">
 Name: <input type="text" name="name"> 
 <input type="submit" value="absenden">
</form>

<?php
/* IP basierte Floodsperre - Version vom: 03.07.2011
 Homepage-Total.de */

error_reporting(E_ALL E_STRICT);

// Floodsperre - Innerhalb der Sperrzeit kann das Formular
// vom selben Benutzer nicht mehrmals gesendet werden.
$floodsperrzeit 10// Sperrzeit in Sekunden

// Datei in der die IP und der Zeitstempel gespeichert werden sollen.
$flooddatei "floodsperre.dat";

// Die letzten X-Einträge speichern
$letzte_eintraege 10;

if (
$_SERVER["REQUEST_METHOD"] == "POST") {

 
// IP und Zeitstempel in der Flooddatei überprüfen
 
if (file_exists($flooddatei)) {
  
$flood false;
  foreach (
file($flooddatei) as $element) {
   list(
$ip$zeit) = explode("|"$element);
   if (
$ip == $_SERVER["REMOTE_ADDR"]) {
    if ((
floor((time() - $zeit))) < $floodsperrzeit) {
     
$flood true;
    }
   }
  }
  if (
$flood == true) {
   echo 
'<p>' $_POST["name"] . ', Sie müssen ' $floodsperrzeit 
   
' Sekunden warten bis Sie wieder einen Namen eintragen können!<p>';
  }
  else {
   
// Name ausgeben, E-Mail versenden, in Datenbank eintragen, etc.
   
echo '<p>Hallo ' $_POST["name"] . '!</p>';
  }
 }

 
// Flooddatei erzeugen und Schreibrechte setzen
 
if (file_exists($flooddatei) === false) {
  
file_put_contents($flooddatei"123|123|\n");
  if (
is_writeable($flooddatei) === false) {
   
chmod($flooddatei0755);
  }
 }

 
// IP und Zeitstempel in der Flooddatei speichern
 
$array file($flooddatei);
 
$array array_slice($array, -$letzte_eintraege);
 
$fh fOpen($flooddatei"w");
 
fLock($fh2);
 
fPuts($fhimplode(""$array) .
 
$_SERVER["REMOTE_ADDR"] . "|" time() . "|\n");
 
fLock($fh3);
 
fClose($fh);

}
?>

</body>
</html>

Bei diesem PHP-Script handelt es sich nur um ein Beispiel, für die Verwendung in einem Programm muss das Script entsprechend angepasst werden.
    Und Ihre Meinung?
      Sie vermissen auf dieser Seite wichtige Informationen oder haben Hinweise für uns?
David R.:
Hi, der Code
if (file_exists($flooddatei) === false) {
geht auch einfacher:
if (!file_exists($flooddatei)) {
Ansonsten ein sehr gutes Script.

Werner:
Das ist mir schon klar, ich wollte nur einmal eine andere Schreibweise aufzeigen.
Hilfe finden Sie im » netzgemein.de - Forum. Auch als „Gast” können Sie dort Fragen stellen!  
 Das könnte Sie interessieren:
Zahlen zweistellig ausgeben  PHP und JavaScript verbinden  Mit PHP schreiben und lesen (5) - Text (E-Mail) als Grafik anzeigen.  Bilderklick-Zähler - Dieses PHP-Script zählt wie oft ein Bild aus einer Galerie angeklickt wurde.  Verzeichnisse oder Dateien auf Schreibrechte prüfen  Array verbinden und lesbar ausgeben  Wörter mit der Stoppwortliste filtern  Einen Satz kürzen  Ladezeit einer Seite ermitteln  Dateien nach Datum sortieren  …mehr
© 2000-2012 Homepage-Total.de Kontakt - Impressum - Banner