Seite 1 von 2

IP-Sperre

Verfasst: 10.05.2007 20:45
von Domitz
Hi, ich suche eine kleine einfache IP Sperre.
Und zwar, dass ein user eine seite, die ich vorgebe nur jede Stunde aufrufen kann.
Das ganze sollte über die Forendatenbank laufen und nicht über cookies.

ist soetwas möglich?
Habs schon mit cookies probiert, aber die, die die deaktiviert haben können halt so oft sie wollen auf die seite...

Verfasst: 11.05.2007 10:30
von Miriam
Das beisst sich was: Die IP-Sperre könnte mehrere Benutzer treffen, weil sie alle dieselbe IP benutzen.
Wäre es nicht sinnvoller, die User mit Hilfe ihrer UserID herauszufiltern?

Verfasst: 11.05.2007 21:12
von Domitz
also zur zeit nutze ich die IP sperre mit cookies.
Problem dabei: user, die keine Cookies akzeptieren können die seite so oft sie wollen reloaden.

gibt es da ne möglichkeit, dass user, die cookies deaktiviert haben ne fehlermeldung bekommen?

Hier der code:

Code: Alles auswählen

<?php
   ob_start();
   $time = 59*60;
   if(!empty($_COOKIE['sperre5'])) {
      echo "<b>Du kannst nur jede Stunde mitspielen!</b>";
   }
   else {
      echo "Du hast XX Punkte gewonnen";
      setcookie("sperre5","sperren5",time()+$time);
   }
?> 

Verfasst: 11.05.2007 21:23
von Stefane
nabend,

dein Script ist ja schon und gut, aber wenn die leute keine Cookies speichern, dann hilft dir das reichlich wenig... leider

Verfasst: 12.05.2007 00:38
von gn#36
Ein sehr rudimentäres Skript, ungetestet:

Code: Alles auswählen

//Speichern der IP wenn sie "benutzt" wurde:
$ip = $_SERVER['REMOTE_ADDR'];
$time = time();
$sql = "INSERT INTO ip_speicher_tabelle (IP, time) VALUES ('$ip',$time)";
$db->sql_query($sql); //oder wie auch immer dein Datenbankaufruf aussehen mag...

//Abfragen der IP ob sie verwendet werden darf:
$time = time();
$ip = $_SERVER['REMOTE_ADDR'];
$sql = "SELECT count(*) AS anz FROM ip_speicher_tabelle WHERE IP = '$ip' AND $time - time < 86400";
$result = $db->sql_query($sql);
$count = $db->sql_fetchfield(0,0,$result);
if($count)
{
//Verboten
}
else
{
//Erlaubt
}

Verfasst: 12.05.2007 13:57
von Domitz
hi, schonmal danke =)
muss ich den code einfach in die gewünschte Datei einbauen oder muss ich da noch etwas verbessern oder ergänzen? also ausser die Zeit?

Verfasst: 12.05.2007 21:50
von gn#36
Nein da wo die Anmerkungen sind musst du natürlich noch was ändern. Ich weiß nicht was du für ein Datenbanksystem verwendest, daher habe ich hier die für das phpBB Forum verwendeten abstrahierten Befehle verwendet (phpBB verwendet ja einen DBAL der das ganze vom Datenbanktyp (mysql, postgres...) unabhängig macht. Das musst du durch deine entsprechenden Befehle ersetzen (es sei denn du baust das in Forumsdateien oder Dateien die das Forumsystem nutzen ein, dann sollte es auch so gehen).

Außerdem musst du den Code wohl aufteilen. Wenn du das so einfach einbauen würdest dann würdest du ja bei jedem Aufruf erst mal speichern dass die IP "benutzt" wurde und danach dann abfragen ob du sie benutzen darfst (was dann wohl nicht der Fall ist, denn sie wurde ja schon benutzt). Du musst also den ersten Teil da einbauen wo du das Speichern realisieren solltest und den zweiten Teil an der Stelle, wo du die Abfrage brauchst. Effektiv könnte es gut sein, dass du dann beide ineinander verschachtelst.

Außerdem existieren die zugehörigen Datenbankstrukturen ja noch gar nicht, selbst wenn du alles was oben steht machen würdest würde erst mal nichts passieren bis du die in den SQL Anweisungen verwendeten Tabellen angelegt hast. Welche Felder darin sein müssen geht aus den SQL Abfragen im Code hervor.

Verfasst: 13.05.2007 12:24
von Domitz
Ok, also muss der SQL befehl so aussehen:

Code: Alles auswählen

ADD `ip_speicher_tabelle` MEDIUMINT( 8 ) DEFAULT '0' NOT NULL ,
oder?

Verfasst: 13.05.2007 13:15
von Miriam

Verfasst: 13.05.2007 16:30
von gn#36
Die Struktur der Tabelle kannst du dir ja anhand der benutzten Datentypen überlegen, INT kannst du für die Zeit verwenden, da ich die IP nicht umwandele musst du wohl für die IP VARCHAR o.ä. nehmen (oder du wandelst die IP um). Die Spaltennamen sind vorgegeben, ich würde mir nicht die Mühe machen den SQL Befehl zum Erstellen der Tabelle von Hand zu machen sondern eher das ganze per Frontend (z.b. phpmyadmin) zusammenklicken.