IpSperre

Hi,
ich bin gerade dabei eine LoginSperre für meine Homepage zu erstellen. Dazu habe ich einfach eine neue tabelle in der gleichen db auf gemacht, die sich ipsperre nennt. Es gibt die felder IP und timefeld. Keine Ahnung warum ich timefeld so genannt hab :smiley:
Naja auf jedenfall bin ich erstmal so weit:

$ip=$HTTP_SERVER_VARS["REMOTE_ADDR"];
$sql="SELECT timefeld FROM ipsperre WHERE ip='".$ip."'";
if ($sql!=false)
{
mysql_query("INSERT INTO `ipsperre` 
(
`ip` ,
`timefeld` 
)
VALUES 
(
'".$ip."', '1' 
)");
echo 'Benutzername oder Password sind falsch. Dir bleiben 2 versuche.';
}
elseif ($sql == "1")
{
mysql_query("UPDATE ipsperre SET timefeld='$sql+1' WHERE ip='".$ip."'");
echo '1 versuch noch';
}
elseif ($sql == "2")
{
mysql_query("UPDATE ipsperre SET timefeld='$sql+1' WHERE ip='".$ip."'");
}

Wenn ich mich falsch einlogge, dann wird meine ip (ist sogar die richtige :smiley: ) in die tabelle eingetragen und eine 1 wird in timefeld geschrieben.
Wenn ich mich dann ein zweites mal falsch einlogge, wird ein neuer eintrag mit der gleichen ip und einer 1 gemacht. Das heißt er vergleicht die ip nicht. Woran liegt das?

Moin,

warum sollte er überhaupt?
Das Script macht nur folgendes.

  1. IP berechnen.
  2. Einen String erstellen.
  3. Falls der nicht vorhanden sein sollte, wird etwas in die Datenbank eingetragen. Eigentlich totaler Quatsch, da der String eine Zeile vorher deklariert wurde und somit immer existiert.
  4. Falls der String $sql den Wert 1 annehmen sollte - aber warum sollte er es? denn nirgendwo wird der String verändert, dementsprechend gilt $sql immer noch wie in Zeile 2
  5. Falls der String $sql den Wert 2 annehmen sollte - aber auch hier: warum sollte er?

Fazit: Es wird nichts überprüft, weil auch gar nichts überprüft wird :stuck_out_tongue:

Lesenswert:
Lektüre 1

Ansonsten solltest du dein Datenbank-Schema überdenken. Für eine IP-Sperre braucht man nicht zwangsläufig eine Datenbank. Google hilft dir :slight_smile:

MfG
myPages

Ja…da hab ich wohl ein bisschen falsch gedacht^^
Hier mal meine gedanken (wie man unschwer erkennen kann ich bin anfänger) :smiley:

$ip=$HTTP_SERVER_VARS["REMOTE_ADDR"];
//ip wird ermittelt und in Variable $ip gespeichert
$sql="SELECT timefeld FROM ipsperre WHERE ip='".$ip."'";
//wert aus timefeld, wo die ip=ermittelte ip ist, in variable $sql gespeichert
if ($sql!=false)
//fals es dazu keinen eintrag gibt...
{
mysql_query("INSERT INTO `ipsperre` 
(
`ip` ,
`timefeld` 
)
VALUES 
(
'".$ip."', '1' 
)");
echo 'Benutzername oder Password sind falsch. Dir bleiben 2 versuche.';
}
//...wird die in $ip gespeicherte ip in die tabelle eingetragen und timefeld bekommt eine 1 und meldung erscheint
elseif ($sql == "1")
//fals die ip in der tabelle ist und timefeld = 1 ist...
{
mysql_query("UPDATE ipsperre SET timefeld='$sql+1' WHERE ip='".$ip."'");
echo '1 versuch noch';
}
//...wird in timefeld 2 eingetragen und meldung erscheint
elseif ($sql == "2")
//fals die ip in der tabelle ist und timefeld = 2 ist...
{
mysql_query("UPDATE ipsperre SET timefeld='$sql+1' WHERE ip='".$ip."'");
}
//...wird eine 3 in timefeld geschrieben

[quote]
Für eine IP-Sperre braucht man nicht zwangsläufig eine Datenbank.[/quote]
Hätte ich aber gerne so…
Ich will nämlich lernen wie das alles funktioniert.
Mit Google hab ich schon ne ganze weile gesucht aber ich finde nix. :neutral_face:

Dein Code funktioniert fast aus dem selben Grund nicht wie dieser hier. PHP kann nicht deine Gedanken lesen. Wenn du einen String anlegst, hast du einen String und nicht mehr.

Dein Code funktioniert fast aus dem selben Grund nicht wie dieser hier. PHP kann nicht deine Gedanken lesen. Wenn du einen String anlegst, hast du einen String und nicht mehr.

Ja also die begründung kappier ich jetz echt nich…

Moin,

ach was solls.

Tabelle: ipsperre (Aufbau)
Werte
Eindeutige Identifikation: id mit integer primary_key, auto_increment
IP: ip mit varchar(20)
Zeit: zeit mit timestamp

<?php
   $user_ip = $_SERVER['REMOTE_ADDR']; // ip des Besuchers ermitteln
   $sql = mysql_query("SELECT * FROM ipsperre WHERE ip = '$user_ip' LIMIT 0,1");
   // ip des Besuchers von der Datenbank abrufen, wobei es maximal ein Datensatz geben darf
   $anzahl = mysql_num_rows($sql); // Anzahl der Datensätze zählen
   if($anzahl == 0) // falls es keinen passenden Datensatz gibt
   {
      mysql_query("INSERT INTO ipsperre (ip, zeit) VALUES ('$user_ip','time()')");
      //Datensatz eintragen 
   }
   else // falls es einen Datensatz gibt
   {
      while($row = mysql_fetch_object($sql))
      {
         //z.B. eine Kontrollstruktur per if(time() < $row->zeit*60*60*24)) { echo 'irgendwas';}
         echo $row->id, $row->ip, $row->zeit; //Ausgabe für die Testzwecke
      }
   }   
?>

Na ja mal kurz runtergeschrieben, kannst du natürlich noch umwandeln und an deine Bedürfnisse anpassen. Es ist auf jeden Fall empfehlenswert eine ID für die eindeutige Identifizierung deines Datensatzes zu deklarieren. Wenn du Anfänger bist, empfehle ich dir, dich mit dieser Seite zu beschäftigen, damit du erstmal die Grundlagen kennenlernst. Ansonsten hilft dir mit Sicherheit auch dieses Tutorial.

MfG
myPages

Was gibt’s da nicht zu kapieren o.0?

Du kannst PHP (eig. keiner Programmier- bzw. Scriptsprache) sagen du willst, ohne zusagen wie :wink:

Es tut mir ja wahnsinnig leid, das ich damit erst vor 8tagen angefangen hab und schon meinen ersten script selber geschrieben hab, wenn er auch nicht ganz richtig ist… :unamused:
Ich weiß halt noch nicht richtig wozu ich dieses mysql_num_rows oder while($row = mysql_fetch_object brauche. Aber ich werd das schon noch lernen.