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: Ausblenden ❘ Kopieren ❘ Zeilen ❘
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($flooddatei, 0755);
}
}
// IP und Zeitstempel in der Flooddatei speichern
$array = file($flooddatei);
$array = array_slice($array, -$letzte_eintraege);
$fh = fOpen($flooddatei, "w");
fLock($fh, 2);
fPuts($fh, implode("", $array) .
$_SERVER["REMOTE_ADDR"] . "|" . time() . "|\n");
fLock($fh, 3);
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: Ausblenden ❘ Kopieren ❘ Zeilen ❘
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: Ausblenden ❘ Kopieren ❘ Zeilen ❘
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
- Checkbox (Mehrfachauswahl) und DB-Ausgabe
- Mit den Checkboxen lassen sich mehrere Einträge von der DB-Tabelle auswählen, auswerten und ausgeben.
- PHP mit Sicherheit
- Sicheres Programmieren – Traue niemals den Eingaben des Benutzers! Speichern Sie fremde Benutzereingaben nie ohne eine Überprüfung in einer Datenbank oder in einer Datei ab.
- Suchanfrage an eine Datenbank über AJAX senden und empfangen
- Ohne das die Seite neu geladen werden muss, kann man über JavaScript eine Suchanfrage an eine PHP-Datei senden (die dann eine DB-Tabelle ausliest) und die Ergebnisse auf der gleichen Seite ausgibt.
- Sitemaps-Protokoll für Suchmaschinen automatisch erstellen
- Sorgen Sie dafür, dass die Nutzer auf einen größeren Teil Ihrer Website aufmerksam werden mit einem „Sitemaps-Protokoll”. Dies stellt eine einfache Möglichkeit für Webmaster dar, Suchmaschinen Seiten auf Ihrer Website zu melden, die zum durchsuchen verfügbar sind.
Abonniere meinen RSS-Feed
um über aktuelle Seiten benachrichtigt zu werden.
Mehrfachauswahl Counter Affenformular Sicherheit Silbentrennung Hover-Effekt Countdown-Generator Authentifizierung Farbschema Keyframes Favicon Datenschutz-Hinweis Seitenformatierung PHP-Fehlermeldungen Animierte Sternebewertung Mimetypen Geolocation API Sitemaps-Protokoll Floodsperre Metadaten Parallax Scrolling-Effekt JSON SQLite Mauszeiger Kommentar-Box