Warning: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php on line 58
IP-Sperre PHP Tutorials nicht nur für Anfänger php-resource.de

php-resource.de

PHP Tutorial: IP-Sperre

IP-Sperre mit PHP und MySQL Oder wie man einen User für eine gewisse Zeit aussperrt.

|22.08.2002 | webmaster1@ | 32928 | KAT : PHP | | Kommentare 0


2

3

3. Scripte

Wie immer lege ich mal wieder ein var.inc.php vor :

var.inc.php

<?php
// Datenbank Variablen
$dbserver "localhost";
$dbname "testgb";
$dbuser "";
$dbpass "";

// Sonstige Variablen
$stehenlassen 120;
?>

So, was steht drin ? Also, die ersten 4 Variablen die mit $db beginnen sind die Verbindungsvariablen zur MySQL Datenbank, sie müssen entsprechend editiert werden, je nachdem wo das GB laufen soll. Bei den sonstigen Variablen brauchen wir momentan nur eine Variable und zwar $stehenlassen, sie gibt an wielange IP's gesperrt werden sollen, die Angabe ist in Sekunden. Mehr brauchen wir nicht an Variablen.

Also nächstes brauchen wir die Seite die das ganze absendet, das Script ist einfaches HTML und simuliert zB. das Absenden seiner Wahl bei einem Umfragescript etc.

form.php

<html>
<head>
<title>klick it !</title>
</head>
Muss ich ja sicher nicht erklären, oder ?
<body>
<form action="check.php" method="post">

Es wird an die Seite check.php weitergeleitet. Sollte keinem Probleme bereiten, ansonsten mal bei SelfHTML vorbei schaun.

<input type="submit" name="sub" value="test">
<input type="submit" name="sub" value="Lösch die Tabelle">

Das ist ein kleiner Trick den ich von schmalle gelernt habe. Ich hab hier nämlich das Problem das ich zwei Buttons habe die an ein Script weiterleiten, allerdings mit zwei verschiedenen Aufgaben. Ich habe mich immer gefragt wie ich sowas realisieren kann, naja und schmalle hat mir den Kniff verraten. Man gibt seinen Submitbuttons einfach einen Namen, hier haben beide den Namen sub , naja und im Folgescript schaut man einfach nach dem Inhalt von $sub und weiss welcher der beiden Submitbuttons gedrückt wurde.

</form>
</body>
</html>

So und nun brauchen wir noch die check.php , das Herz dieses Tutorials auch wenn es noch ein sehr rudimentäres Herz ist. Aber es ist ja auch nur ein Grundlagentutorial.

check.php

<html>
<head>
<title>check</title>
</head>
<body>
<?php
include("var.inc.php");
?>

Hier werden die ‚globalen' Variablen included. Dies macht Sinn bei grösseren Projekten bei denen bestimmte Daten von vielen Scripten benötigt werden, zB. Die Daten zur Konnektierung zur Datenbank, durch das includen hat man den Vorteil dass man die Daten nur einmal verändern muss, anstatt das man jedes Script ändern müsste.

<?php
$conn 
= @mysql_connect($dbserver,$dbuser,$dbpass);
if (!
$conn
{
die(
"Sorry, Datenbank nicht gefunden !");
}
?>

Hier wird eine Verbindung zum MySQL-Server aufgebaut, das @ Zeichen unterdrückt eine Fehlermeldung wenn der Versuch fehlschlägt, dies geschieht wieder aus Schönheitsgründen, naja und dann wird geschaut ob die Verbindung zustande kam. if(!$conn) ist wieder so ein kleiner Kniff, denn eigentlich will man ja wissen ob es geklappt hat, aber es sinnvoller zu schaun ob es nicht geklappt hat, denn dann brechen wir das Script ab und müssen nur einen Befehl in die if-Klammer setzen, ansonsten müssten wir alle weiteren Befehle einklammern. Das ! Zeichen negiert den Ausdruck $conn, falls dieser also FALSE ist dann wird der if Ausdruck TRUE, denn Minus mal Minus ist ja auch Plus. Es werden hier viele logische Elemente benutzt die es lohnt sich vor Augen zu führen da man sich dadurch eine Menge an Programmierarbeit sparen kann. Ausgenutzt wird das mysql_connect ein FALSE zurück gibt wenn die Verbindung nicht zustandekommt. Da aber der if Befehl überprüft ob der Ausdruck TRUE ist müssen wir ihn negieren , also Fragen wir „WENN (if) NICHT (!) VERBINDUNG ($conn) DANN TUE DIES (die)". Es macht öfters sinn sich die Programmzeilen, gerade bei Abfragen, in ‚Deutsch' zu übersetzten, dann wird der es manchmal einfachen, besonders bei komplexeren logischen Ausdrücken.

<?mysql_select_db($dbname,$conn);?>

Hier wird dann die Datenbank ausgewählt, dieser Befehl ist nötig wenn mehrere Datenbanken auf den DB-Server existieren. Damit wird die erstellte Verbindung $conn mit der Datenbank $dbname ‚verbunden'. Es kann ja durchaus sein dass man mehrere Verbindungen zu verschiednen Datenbanken aufbaut.

<?php
if ($sub == "test")
?>

So, hier testen wir jetzt welchens value der Submitbutton hatte. Ist dieser test dann wird die IP Sperren Routine durchlaufen, ansonsten geht's weiter unten nach else weiter.

<?php
{
$ip $HTTP_SERVER_VARS["REMOTE_ADDR"];
?>

Hier wird nun die IP eingelesen und in die Variable $ip geschrieben. Diese Variablen sind sogenannte Umgebungsvariablen und es gibt sehr viele von ihnen, abrufen kann man sie mit dem Befehl phpinfo(); Dann wird alles angezeigt was es so gibt.

<?php
$zeit 
time ();
?>

Hier wird erstmal die aktuelle Zeit festgestellt und gespeichert.

<?php
$nichtmehrgueltig 
$zeit-$stehenlassen;
?>

So, in $nichtmehrgueltig wird der Timestamp gespeichert ab dem gesperrt wird.

<?php
$query 
"DELETE FROM iptest WHERE timefeld <= ".$nichtmehrgueltig;
mysql_query($query,$conn);
?>

Jetzt kommen wir zum Eingemachten, zuerst wird alles aus der Tabelle gelöscht was zu alt ist, was also wieder gütig ist. Sprich es wird freigegeben was älter ist als $nichtmehrgültig. Das muss zuerst passieren bevor man abfragt ob der User ‚legal' hier ist. Hmm, mir fehlen gerade die Wort zum beschreiben, die Idee ist ja alle aus zu sperren die zu früh wiederkommen, hier werden jetzt die aus der Tabelle gestrichen die schon lange genug weg waren und nicht wiederkehrten.

<?php
$query 
"SELECT * FROM iptest WHERE ip = '".$ip."'";
$result mysql_query($query,$conn);
?>

Nachdem wir jetzt alle gestrichen haben die wiederkommen dürfen lesen wir aus der Tabelle aus ob die aktuelle $ip schon in der Tabelle drinsteht...

<?php
$rows 
mysql_num_rows($result);?>

..denn 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 !!

<?php
if ($rows >= 1)
//Nun schauen wir ob $rows >= 1 ist,.... 
{
echo 
"Sorry diese IP ist noch gesperrt !";

//...ist dies der Fall steht die IP schon in der Tabelle und das wird ausgegeben. 
else

//echo "Okay sie werden jetzt $stehenlassen sec. lang gesperrt !";
//Wenn nicht dann wird ausgegeben dass man jetzt $stehenlassen Sekunden gesperrt ist.
$query "INSERT INTO iptest VALUES ("$ip", $zeit)";
mysql_query($query,$conn); 
}
//Und dies wird in die Datenbank eingetragen, also der aktuelle Timestamp in Form der 
//Variable $zeit und die aktuelle IP.
}
else
{
$query "DELETE FROM iptest";
mysql_query($query,$conn);
echo 
"Daten wurden gelöscht !";
//Dies ist nun der else Teil der $sub Abfrage, hier hatten man ja die Möglichkeit die gesamte 
//Tabelle, nur den Inhalt dieser, zu löschen. Das wird hier geamcht, ist keine Kunst wie man 
//sieht, eifach der DELETE Befehl ohne Bedingung und das Teil ist leer.
}
mysql_close($conn); 
?>
?>

Jetzt schliesen wir noch die Connection zur Datenbank und die Hexerei hat ihr Ende. Das war es schon wieder, wie man sieht ist es garnicht so schwer sowas zu realisieren wenn man weiss wie es geht. Ich muss gestehen dass ich beim erstenmal auch zuerst einmal da stand und nicht so recht wusste wie ich es machen soll. Aber mit ein wenig nachdenken geht's recht einfach, wie man sieht.

<br>
<form action="form.php" method="post">
<input type="submit" name="sub" value="nochmal">
</form>
</body>
</html>

Dieser kleine Form Teil ist nur dazu da wieder auf die form.php zurück zu kommen.

Navigation -> Seitenanzahl : (3)

  «  1 2 3  » 
Kommentare zum Tutorial
Tutorial kommentieren
 
Über den Autor
webmaster1@

webmaster1@

Status
Premium Mitglied

Beruf
Unbekannt

Mitglied seit:
30.04.2009

letzte Aktivität
04.06.2009

 

Tutorial bewerten

Hat Ihnen dieses Tutorial gefallen? Dann bewerten Sie es jetzt! Fünf Sterne bedeutet "Sehr gut", ein Stern "Unzureichend".



 

aktuelle Artikel

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Neu | Berni

Wissensbestand in Unternehmen

Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Neu | Berni