PHP+SQL IP Adresse überprüfen & blockieren

jap

Aktives Mitglied
Thread Starter
Dabei seit
16.06.2004
Beiträge
140
Reaktionspunkte
1
Hi alle!
Ich hoffe mir kann jemand weiterhelfen, bin nämlich nicht vom Fach und das einlesen raubt imense Zeit.

Ich möchte verhindern dass ein Besuche mein Formular zweimal ausfüllt, also seine IP auslesen, vergleichen ob er schoneinmal af der Seite war und wenn nicht seine IP in meine DB schreiben.

Mein Code schau mal schon so aus aber es funktioniert noch nicht ich weis dass es wohl mit den Arrys zusammenhängt. Kann gut seind ass noch mehr nict stimmt oder komisch ist. Ich hoffe jemand kann mir hierbei helfen!

PHP:
mysql_connect('localhost:8889', 'root', 'root');
mysql_select_db(bodensee);

//---------------ip blockieren--------------------
$sql="SELECT id FROM blockliste";
$anfrage = mysql_query($sql) OR die(mysql_error());
$sql = "SELECT count(*) AS id FROM blockliste";
$anfrage = mysql_query($sql);
$row = mysql_fetch_array($anfrage);
//echo $row['id'];
//noch keine schleife die muss noch hin um alle adressen der DB zu durchsuchen

	$sql="SELECT adresse FROM blockliste WHERE id = 1";
	$anfrage = mysql_query($sql) OR die(mysql_error());
	$adresseDB = mysql_fetch_array($anfrage);
	//echo $adresseDB['adresse'];

	if($adresseDB['adresse'] == $_SERVER["REMOTE_ADDR"])
	{
		echo "Bereits teilgenommen!";
	}
	else
	{
		echo "c";
		$sql="SELECT adresse FROM blockliste";
		$anfrage = mysql_query($sql) OR die(mysql_error());
		$sql = "INSERT INTO adresse VALUES '".$_SERVER["REMOTE_ADDR"]."'";
		$anfrage = mysql_query($sql) OR die(mysql_error());
	}
 
Hi.

Sieht irgendwie sehr zusammengeklickt aus und ist (jedenfalls für mich) recht schwer nachzuvollziehen was der Code genau machen soll.
Du liest aus einer Tabelle sämtliche IDs aus und willst dann anhand der IDs, die du im nächsten Schritt auf 1 setzt, die Adresse zu vergleichen. Wo genau hängt's denn das erste mal? Fehlermeldung?

Ich würde folgendermaßen vorgehen:
- Tabelle komplett auslesen (oder zumindest IDs und Adressen)
- alles in ein Array werfen
- mit in_array() prüfen ob aktuelle IP schon vergeben ist
- ... Rest sollte klar sein

Ich würde übrigends um ganz sicher zu gehen noch nen Cookie setzen.
 
Hi ihr!

@gottschalk: ja war nicht die Frage ;)
@irocko & alle:
Der code soll ein zweites Abschicken meines Umfragebogens verhindern damit meine umfrageergbnisse nicht verfälscht werden.

Also andhand der ip schauen ob der Mensch schon da war oder nicht, ganz einfach gesagt.

Stimmt der code ist übel zusammengeschustert ;) ist halt dumm wenn man sich als laie da einlesen muss und man wird in Foren sau schnell dumm angemacht.

Das mit in_array hab ich noch nie gelesen mal schauen ob das geht...
@irocko wie würdest du das denn machen?
hab ne extra Tabelle die blockliste heißt und die ie Felder id und adresse hat.

schlaft gut! bis morgen!
 
Das du weißt was du machen willst war mir schon klar, wollte nur wissen ob du weißt was der Code da in etwa wirklich bewirken würde. ;)
Ich hab mal eben was zusammengeschustert was bestimmt so nicht funktionieren wird wegen irgendwelchen dussligen Tippfehlern. Hab schon ne Weile nix mehr gemacht. Aber so kannst du dir vielleicht vorstellen wie ich's machen würde.

PHP:
$db = mysql_connect('localhost:8889', 'root', 'root') or die ("keine Verbindung...<br>Fehler: ".mysql_error()."...<br>");
$table = "bodensee";
$dbname = "":

//---------------ip blockieren--------------------
$sql="SELECT * FROM blockliste";
$anfrage = mysql_db_query($dbname, $sql);

$ipLogged = false;
$num_entries = mysql_num_rows($anfrage);
for($i=0;$i<mysql_num_rows($anfrage);$i++)
{
    $row[$i] = mysql_fetch_array($result);
    if($row[$i]['adresse'] == $_SERVER["REMOTE_ADDR"]) {
    	$ipLogged = true;
    }
}



if($ipLogged == true)
{
	echo "Bereits teilgenommen!";
	$sql = "INSERT INTO $table SET adresse = '$_SERVER["REMOTE_ADDR"]'";
	$anfrage = mysql_query($sql) OR die(mysql_error());
}
 
Es ist nicht sinnvoll, die vollständige Tabelle in ein Array zu laden, man bedenke nur den Geschwindigkeitsverlust bei dem Auslesen aller Daten, die ja durchaus auch mit größeren Mengen funktionieren sollten.

Viel sinnvoller erscheint mir hier, die SQL-Abfrage auf das Nötigste schon vor der Überführung zu begrenzen. Dafür wurde nämlich der »WHERE«-Operatur in SQL geschaffen, was ganz nebenbei die Ausführungsgeschwindigkeit vor allem dann erheblich beschleunigt, wenn man damit zufrieden sein kann, wenn man ein und nicht mehrere Ergebnisse bekommt (in Deinem Beispiel reicht ja ein Vorkommen einer IP).

PHP:
$sql = sprintf("SELECT * FROM blockliste WHERE adresse='%s' LIMIT 1"
                , $_SERVER['REMOTE_ADDR']);
if ($res = mysql_query($sql, $connectionID)) {
   if (mysql_num_rows($res)>0) {
       // Was will man mehr?
       echo "IP-Adresse gefunden";
   }
}

Zu Deinem Konzept per IP-Adresse Benutzer auszusperren: Schau Dir mal den gewöhnlichen AOL-Nutzer an, der einen Proxy verwendet. Er teilt mit tausenden weiteren Nutzern dieselbe IP-Adresse aus Deiner Sicht. Insofern solltest Du Dir etwas anderes einfallen lassen, sonst wird es schnell frustierend. Übrigens ist die Verwendung eines Session-Cookies durch das folgende Löschen eines solchen eine sehr simple Methode, um eine Ausperrmethode, die ein Cookie setzt, auszuhebeln.

Wenn Du möchtest, dass derselbe Benutzer nicht erneut teilnimmt, kannst Du seine IP-Adresse nur für eine gewisse Zeitspanne »sperren«, oder Du verlangst eine Eingabe, wie eine E-Mail-Adresse, die Du anschließend ebenfalls auf Vorkommen prüfst und nur einmal zulässt.
 
Zuletzt bearbeitet:
OK, der Punkt geht an dich.
Ich hatte darauf spekuliert das eventuell die Daten der kompletten Tabelle nach der Prüfung noch verarbeitet werden sollen und so nicht nochmal ausgelesen werden muss. Kommt halt drauf an wie's im Script weiter geht.

Auch das mit der eMail Adresse halte ich für sinnvoll.
Ohne weitere Daten vom Benutzer zu verlangen ist man eben auf IPs und Cookies angewiesen. Session IDs sind sehr flüchtig und Cookies mögen ja auch nicht alle.
 
Wow! Vielen dank für eure Mühe, hätte ich nicht erwartet bin echt froh!
Vielen Dank irocko!
Wenn das mit den AOL Nutzern so ist dann ists ja total doof mit der ip Sache :( Danke für den Hinweis ich wusste das nicht.
@hilarious: Ist das mit dem cookie ablegen einfach?
Das ganz hier ist nur ein einfacher Umfragebogen, der Rest steht schon muss nur noch verhindern dass die Leute da draufspammen können...
 
Das Prüfen der Email Adresse hat mE zwei Probleme.

Zum Einen wird nicht jeder Benutzer bereit sein, sein (reale) Emailadresse einzugeben, um an einer Umfrage teilzunehmen (z.B. aus Angst vor SPAM oder aus anderen gründen). Schon dadurch kann u.U. das Ergebnis verfälscht werden.

Zum Anderen kann ein Benutzer, der bewusst das Umfrageergebnis verfälschen möchte, problemlos jeweils unterschiedliche Emailadressen eingeben - Phantasieadresse oder (fremde) real existierende Adressen.
 
Wenn das mit den AOL Nutzern so ist dann ists ja total doof mit der ip Sache :( Danke für den Hinweis ich wusste das nicht.
Das betrifft nicht nur AOL. Das betrifft auch Studentenwohnheime, wenn mehrere aus einer Familie zugreifen wollen, wenn mehrere aus einer Firma zugreifen wollen, usw.
Außerdem kann es auch den typischen T-Online, Alice, 1&1, usw. Nutzer treffen. Denn jeder bekommt dynamisch eine IP zugeteilt. Geht er Offline bekommt der nächste Nutzer diese IP-Adresse.

Eine IP-Adresse kann immer nur für eine kurze Zeit als ein Kriterium genutzt werden und hilft dann nur gegen versehentliches doppeltes Absenden.
 
Völlig richtig, maceis. Im Falle einer anonymen Umfrage wäre meine E-Mail-Adresse ja nicht mehr Teil der Anonymität.

Ich denke, strategisch bleibt nur, eine Sitzung zu verwenden (ja, dazu wird ein Cookie gesetzt, dass machst Du aber nicht selbst, sondern dafür sorgt das PHP-Session-Management), und ein wenig an die Redlichkeit der Teilnehmer zu apellieren. Schließlich vertrauene sie Dir bei der Abgabe der Daten ja auch.
 
Seh das genauso wie maceis, die e-Mail anzugeben ist zu abschreckend.

Reicht es einen cookie abzulegen? Er soll nicht lange bestehen.
Irgendwie wächst mir das bisschen über den Kopf (zeitlich und technisch) kennt jemand so spontan ein einfaches Tutorial zu so ne cookie Sache? Müsste doch einfach sein oder nicht?

Danke euch!
 
Das Tutorial ist recht schnell erzählt:

Voraussetzung ist eine Standardinstallation von PHP4.4.x oder höher (PHP5 bevorzugt aber nicht zwingend notwendig für diese Geschichte).

Am Anfang jedes eigenständigen Scriptes (also ausgenommen Dateien, die Du per include oder require nachlädtst) musst Du die Session initialisieren mit session_start(). Anschließend kannst Du jeden Wert in der superglobalen SESSION-Feldvariable speichern:

PHP:
session_name('MeineSessionHiHeiHo');
session_start();
// Jetzt wurde dem Benutzer ein Cookie gesetzt, wenn er diesen zulaesst.

$_SESSION['counter']++;
echo "<pre>\n", print_r($_SESSION), "</pre>\n";

// Bei jedem Aufruf dieses Skriptes wird 'counter' um eins erhöht.
// Damit Du siehst, was die Session sonst noch so speichert, 
// wird mit print_r einfach ein komfortabler Dump erzeugt.

Beispielausgabe:
PHP:
Array
(
    [counter] => 5
)
1
 
Zuletzt bearbeitet:
hmm irgendwie versteh ich das grade nicht ganz. Ok es wird dann ein cookie abgelegt, aber wie nutze ich diesen dann? Die Beispielausgabe versteh ich auch nicht... was ist ein dump?
 
Hi Pingu!
ich versteh das schon dass der counter erhöh wird usw aber die Ausgabe ist komisch, das manual bringt mir nicht sehr viel verstehe eigentlich nichts... ich hab das Beispiel gerade ausprobiert und die Ausgabe ist genau so wie sie hilarious gepostet hat, die Zahl erhöht sich immer... ich weis nur nicht wo ich ansetzen muss. Wie komme ich an diese Session ID und mit was kann ich die vergleichen um zu wissen ob er/sie schoneinmal hier war?
Ich les mal weiter...
 
hmm irgendwie versteh ich das grade nicht ganz. Ok es wird dann ein cookie abgelegt, aber wie nutze ich diesen dann? Die Beispielausgabe versteh ich auch nicht... was ist ein dump?

Probier's doch einfach aus: Abspeichern als PHP-Datei, in das Veröffentlichungsverzeichnis, in dem Du auch sonst PHP-Code ausführst, Browser dahin führen und immer wieder neu laden. Und siehe da, der Counter wird immer eins höher. Um Cookies und dergleichen brauchst Du Dich nicht direkt zu kümmern.
 
Aber ist eine Session nicht vielleicht doch zu kurzfristig?
Ich meine ich kenne ja den genauen Anwendungszweck in diesem Fall nicht aber es würde ja reichen den Browser zu schließen um die Session zu zerstören.
Wenn das für den Zweck natürlich ausreicht hab ich nix gesagt. ;)
 
Hi Pingu!
ich versteh das schon dass der counter erhöh wird usw aber die Ausgabe ist komisch, das manual bringt mir nicht sehr viel verstehe eigentlich nichts... ich hab das Beispiel gerade ausprobiert und die Ausgabe ist genau so wie sie hilarious gepostet hat, die Zahl erhöht sich immer... ich weis nur nicht wo ich ansetzen muss. Wie komme ich an diese Session ID und mit was kann ich die vergleichen um zu wissen ob er/sie schoneinmal hier war?
Ich les mal weiter...

Du kannst in dem superglobalen Array alles mögliche speichern. Zum Beispiel den Wert, ob der Besucher schon einmal da gewesen ist.
PHP:
session_name('MeineSessionHiHeiHo');
session_start();

// Beim allerersten Mal müsste $_SESSION['counter'] nicht definiert sein.
// In PHP ist das nicht weiter schlimm 
// und kann als gleich Null verstanden werden.

// Jetzt erhoehen wir den Counter um 1:
$_SESSION['counter']++;

// Ist dies der erste Aufruf?
if ($_SESSION['counter'] <= 1) {
    echo "<p>Ich kann nicht sagen, dich schon einmal gesehen zu haben.</p>";
} else {
    printf("<p>Du bist jetzt zum %u Mal da.</p>", $_SESSION['counter']);
}

Um den Counter zurückzusetzen, lösche Deine Browser-Cookies (oder nimm einen anderen Browser). Wundere Dich nicht, wenn Du bei Macuser Dich neu anmelden musst (aha?).
 
Aber ist eine Session nicht vielleicht doch zu kurzfristig?
Ich meine ich kenne ja den genauen Anwendungszweck in diesem Fall nicht aber es würde ja reichen den Browser zu schließen um die Session zu zerstören.
Wenn das für den Zweck natürlich ausreicht hab ich nix gesagt. ;)

Das kommt auf die Konfiguration an, die man mit der PHP-Methode session_set_cookie_params() entsprechend überschreibt.
 
Zurück
Oben Unten