Also in diesem Skript versuche ich euch zu zeigen wie man ganz einfach eine IP-Sperre mit MySQL erstellen kann. Es ist ein kleines bisschen HTML und PHP Wissen notwendig, da ich nicht jede Kleinigkeit erkläre.
Also als erstes müssen wir eine Tabelle anlegen, welches wir so machen:
SQL(zum Beispiel in phpMyAdmin verwendbar):
CREATE TABLE ipsperre (
ip varchar(16) default '0',
timefeld timestamp(14) NOT NULL
)
So nun haben wir alles, um mit den Skripten an zu fangen.^^
Nun legen wir eine PHP-Datei an, indem ein paar Variablen gespeichert sind.
var.inc.php:
<?php
// Datenbank Variablen
$dbserver = "localhost"; // MYSQL Hostname (meist localhost)
$dbname = "ipdb"; // MYSQL Datenbankname
$dbuser = "username"; // MYSQL Username
$dbpass = "passwort"; // MYSQL Passwort
// Sonstige Variablen
$gueltigkeit = 120; // Dauer der IP-Sperre
?>
Die 4 Datenbank Variablen müssen entsprechend an eure Datenbank angepasst werden und bei der letzte Variable kann natürlich auch die Dauer der IP-Sperre, also wie lange die IP gesperrt sein soll, geändert werden, eben so, wie man es gerade braucht.
Nun brauchen wir noch ein Formular mit dem wir unsere IP-Sperre testen können.
Dazu erstellen wir einfach ein kleines Formular mit HTML.
test.html:
<html>
<head>
<title>IP-Sperre</title>
</head>
<body>
<p align="center">Bitte klicken Sie auf "Testen", um die IP-Sperre zu testen; um die Datenbank mit allen gesperrten IP's zu löschen klicken Sie bitte auf "Tabelleninhalt löschen".<br>Vielen Dank für die Nutzung des Skripts.</p>
<form action="check.php" method="post">
<input type="submit" name="sub" value="Testen">
<input type="submit" name="sub" value="Tabelleninhalt löschen">
</form>
</body>
</html>
Dieses Formular sendet die Variable sub nun an die Datei check.php, wo dann die entsprechende Funktion ausgeführt wird. Entweder ist die Variable sub gleich Testen oder Tabelle löschen, je nachdem welchen Button anklickt.
So nun kommen wir zum eigentlichen Inhalt dieses Skripts die IP-Sperre, welches sich nun in der Datei check.php abspielt.
check.php:
<html>
<head>
<title>check</title>
</head>
<body>
<?php
include("var.inc.php");
----
Hier wird der Inhalt der Datei var.inc.php geöffnet.
----
$conn = mysql_connect($dbserver,$dbuser,$dbpass);
if (!$conn){
die("Fehler! Die Datenbank ist nicht erreichbar.!");
}
----
Mit mysql_connect(db,user,pass) wird eine Verbindung zum MySQL-Server hergestellt. Falls die Verbindung mit dem Server fehlschlägt, wird mit die() eine Nachricht angegeben.
----
mysql_select_db($dbname,$conn);
----
Hier wird nun die Datenbank ausgewählt.
----
if ($sub == "Testen"){
----
Nun wird abgefragt, ob die eben übertragende Variable $sub gleich Testen ist, also ob man den Button "Testen" angeklickt hat.
----
$ip = $_SERVER['REMOTE_ADDR']; // IP wird ermittelt und in $ip gespeichert (bei einer älteren PHP Version funktioniert wahrscheinlich dies: $HTTP_SERVER_VARS["REMOTE_ADDR"])
$zeit = time(); // aktuelle Zeit wird in $zeit gespeichert
$nichtmehrgueltig = $zeit-$gueltigkeit; // in $nichtmehrgueltig wird der Timestamp gespeichert ab dem gesperrt wird
----
In diesem Teil werden viele Variablen deklariert(festgelegt). Die genauen Beschreibungen bitte den Kommentaren entnehmen.
----
$query = "DELETE FROM ipsperre WHERE timefeld <= ".$nichtmehrgueltig;
mysql_query($query,$conn);
----
Jetzt wird abgefragt, ob es in der Tabelle Einträge gibt, deren Sprerrung schon aufgehoben ist und dieser IP-Eintrag wird dann gelöscht.
----
$query = "SELECT * FROM ipsperre WHERE ip = '".$ip."'";
$result = mysql_query($query,$conn);
----
Nachdem wir alle alten Einträge gelöscht haben, lesen wir aus der Tabelle aus ob, die aktuelle $ip schon in der Tabelle drinsteht...
----
$rows = mysql_num_rows($result);
----
... ist dies der Fall, dann ist die Variable $rows > 0. Hier wird jetzt mit dem Befehl mysql_num_rows festgestellt wieviele Datensätze gefunden wurden in der Tabelle. Unsere Bedingung ist ja dass die IP noch nicht vorhanden sein darf. Ist sie vorhanden dann ist die IP gesperrt. Hier ist jetzt Vorsicht geboten, es gibt eine Falle auf die man reinfallen kann. Es reicht nämlich nicht zu prüfen ob $result TRUE ist, denn $result ist immer TRUE wenn der SQL-Query legal ist. Man könnte ja annehmen wenn der Query keine Datensätze zurückliefert dass $result FALSE ist , dies ist aber nicht der Fall !!
----
if ($rows >= 1){
echo "Sorry diese IP ist noch gesperrt !";
----
Nun wird geguckt, ob $rows größer oder gleich 1 ist, wenn ja is die IP noch gesperrt.
----
}else{
echo "Die IP wurde gespeichert und Sie sind nun ".$gueltigkeit." Sekunden lang gesperrt!";
$query = "INSERT INTO ipsperre VALUES (\"$ip\", $zeit)";
mysql_query($query,$conn);
}
----
Ist $rows 0, dann wird nun die IP in die Tabelle eingetragen.
----
} else {
$query = "DELETE FROM ipsperre";
mysql_query($query,$conn);
echo "Daten wurden gelöscht!";
}
----
Ist $sub nicht gleich Testen, sondern etwas anderes, dann wird der Inhalt der Tabelle ipsperre gelöscht, also wenn auf "Tabelleninhalt löschen" geklickt wurde.
----
mysql_close($conn);
----
Mit diesem Befehl wird die Verbindung zum Server geschlossen.
----
echo "<br><br><a href="test.html">Zum Testformular zurückkehren.</a>"
----
Hier wird nun noch schnell ein Link angezeigt, damit man zum Formular zurückkomt.
----
?>
Ich hoffe ich konnte helfen. Bei Fragen oder Korrekturen mir einfach ein Private Nachricht oder eine Email an rayzer@r1x.de schicken.
Viel Spaß noch mit dem Skript...
MfG r1x