Floodsperre

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 (Seite neu laden) 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.

IP basierte Floodsperre

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

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
<!DOCTYPE html>
<html>
 <head>
  <meta charset="UTF-8">
  <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
 Werner-Zenk.de */

// 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"// Benötigt Schreibrechte

// 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>htmlspecialchars($_POST["name"], ENT_HTML5'UTF-8') . ', 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 ' htmlspecialchars($_POST["name"], ENT_HTML5'UTF-8') . '!</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.

Session basierte Floodsperre

Mit etwas weniger Programmieraufwand lässt sich eine Session basierte Floodsperre verwenden.

Quelltext:  AusblendenKopierenLinkZeilen

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
<?php
session_start
();
?><!DOCTYPE html>
<html lang="de">
 <head>
  <meta charset="UTF-8">
  <title>Session basierte Floodsperre - Demo</title>
 </head>
<body>

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

<?php
/* Session basierte Floodsperre
 Werner-Zenk.de */

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

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

 
// Floodsperre
 
$floodsperre false;
 if (isset(
$_SESSION["floodzeit"])) {
  if (
floor(time() - $_SESSION["floodzeit"]) < $floodsperrzeit) {
   
$floodsperre true;
  }
 }

 if (
$floodsperre) {
  echo 
'<p>htmlspecialchars($_POST["name"], ENT_HTML5'UTF-8') . ', 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 ' htmlspecialchars($_POST["name"], ENT_HTML5'UTF-8') . '!</p>';

  
// Floodsperre aktivieren
  
$_SESSION["floodzeit"] = time();
 }

}
?>

</body>
</html>

Session basierte Floodsperre (Beispiel 2)

Mit autom. Weiterleitung wenn die Sperrzeit noch nicht abgelaufen ist.

Quelltext:  AusblendenKopierenLinkZeilen

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
<?php
session_start
();

/* Session basierte Floodsperre mit autom. Weiterleitung
 Werner-Zenk.de */

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

// Floodsperre
if (isset($_SESSION["floodzeit"])) {
 if (
floor(time() - $_SESSION["floodzeit"]) < $floodsperrzeit) {
  
header("Location: weiterleitung.php");
  exit;
 }
}
?>
<!DOCTYPE html>
<html lang="de">
 <head>
  <meta charset="UTF-8">
  <title></title>
 </head>
<body>

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

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

 
// Name ausgeben, E-Mail versenden, in Datenbank eintragen, etc.
 
echo '<p>Hallo ' htmlspecialchars($_POST["name"], ENT_HTML5'UTF-8') . '!</p>';

 
// Floodsperre aktivieren
 
$_SESSION["floodzeit"] = time();
}
?>

</body>
</html>

Tipps

Mit dem PHPMailer E-Mails sicher versenden
Damit E-Mails sicher beim Empfänger ankommen und nicht irgendwo anders landen (Spamordner) oder sogar vom Provider abgelehnt werden nutzt man am besten eine fertige Mailer-Klasse wie den „PHPMailer”.
Dateibrowser
Ein einfacher Dateibrowser, ideal um PHP-Scripte auf einem lokalen Webserver zu testen, die PHP-Scripte müssen dann nicht mehr umständlich über die Adresszeile des Browsers aufgerufen werden.
Kontaktformular - E-Mail mit PHPMailer und SMTP versenden
Manchmal möchte man die E-Mail vom Kontaktformular über dem PHPMailer und SMTP versenden. Weil das aber nicht so einfach ist und bestimmte Einstellungen beachtet werden müssen, stelle ich hier beispielhaft ein PHP-Skript vor.
Audio-Player
Mit diesem Audio-Player kann man Audio-Dateien über JavaScript steuern.

Abonniere meinen RSS-Feed um über aktuelle Seiten benachrichtigt zu werden.