2010-01-07 7 views
13

Ist es für einen Benutzer möglich, das Ergebnis zu schmieden, das von $_SERVER['REMOTE_ADDR'] in PHP zurückgegeben wird, so dass sie theoretisch SQL-Injektion in einer Datenbank verwenden könnten?IP-Adresse SQL-Injektion

Das ist ein bisschen dumm, aber ich bin noch neu genug, um PHP, die ich möchte wissen, ob es getan werden kann, ob ich Datenbank eingegeben wird, wenn die SELECT Anweisung wählt sanieren müssen von IP-Adressen aus $_SERVER['REMOTE_ADDR'] zurück . Also, wenn ich etwas wie $query = "SELECT * FROM users WHERE IP='" . $_SERVER['REMOTE_ADDR'] . "'"; verwenden wollte, würde es eine Gefahr für mein Tun geben?

Noch einmal, wahrscheinlich eine "nooby" Frage, aber ich fühle es muss gefragt werden.

Dank

Antwort

16

Es ist eine Strecke, und es ist unwahrscheinlich, aber ich würde nicht so weit gehen, wie es ist unmöglich zu sagen. Also ....

Verwenden Sie trotzdem parametrisierte Abfragen.

Auch wenn Sie nie über das IP-Adressfeld angegriffen werden, erhalten Sie den zusätzlichen Vorteil schneller Abfragen durch Caching.

+0

Was sind parametrisierte Abfragen? Kannst du ein Beispiel geben? – Cyclone

+3

Ich schaute sie auf. Vielen Dank! – Cyclone

+2

Sie "würden nicht so weit gehen zu sagen" = Sie kennen die Antwort nicht. Andrew McGregor (unten) scheint zu wissen, wovon er spricht. –

5

saniert immer alle externen Eingänge - verwenden mysql_real_escape_string, oder besser noch, prepared statements

2

Sie könnten PHP Data Filtering Funktionen verwenden.

filter_var() mit FILTER_VALIDATE_IP überprüft die Remote-IP. Wenn die Remote-IP gültig ist, verwenden Sie sie in SQL.

EDIT: filter_input() mit INPUT_SERVER ist eine weitere Option;)

http://www.php.net/manual/en/book.filter.php

http://www.php.net/manual/en/filter.filters.validate.php

http://www.php.net/manual/en/function.filter-var.php

http://www.php.net/manual/en/function.filter-input.php

hoffe, das hilft,

Simeon

+0

Über welche Art von Performance-Hit reden wir? Geht dieser Filter buchstäblich ins Internet, um die IP zu überprüfen? –

1

Ich habe diesen Code immer in alle meine Projekte gesteckt (etwas anfängliche Bereinigung), um zu verhindern, dass irgendetwas mit gefälschten IPs passiert. Ich bin mir nicht sicher, ob sie die REMOTE_ADDR trotzdem fälschen können.

function validate_ip($ip) { 
    // Try IPv4 First, as its the most used method right now 
    if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { 
     // Oops... try v6 
     if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { 
      return false; // Sorry... 
     } 
     else { 
      return true; 
     } 
    } 
    else { 
     return true; 
    } 
} 
if(!isset($_SERVER['REMOTE_ADDR'])) # wtf? 
    die("Could not find your IP Address..."); 
else { 
    if(validate_ip($_SERVER["REMOTE_ADDR"])) 
     die("Could not validate your IP Address..."); 
} 
+3

Das '# wtf?' Brachte mich zum Lachen – Cyclone

+0

Haha richtig, ich habe den Kommentar vergessen, den ich hinzugefügt habe. Late-Night-Coding (naja, kleine und einfache Code-Stücke zu schreiben, nur um wach zu bleiben) zwingt mich, schreckliche Kommentare zu schreiben. –

6

Ich denke, die einzige Möglichkeit für jemanden $_SERVER['REMOTE_ADDR'] zu schmieden wäre ein IP-Paket mit einer gefälschten IP-Adresse zu konstruieren (weil es durch den Server eingestellt ist, nicht auf das Client), wobei in diesem Fall Antworten geführt werden würden zurück zur gefälschten Adresse. Wenn Sie sich Sorgen über Injektionsangriffe machen, dann sind Sie in Ordnung, denn die Adressfelder in IP-Paketen bieten nur Platz für Adressen.

+0

Ich stimme zu (eigentlich schrieb ich das wie du geschrieben hast). Es wäre jedoch theoretisch in Ordnung Injektionen zu versuchen, die einen anderen Zugang ermöglichen würden (blind wie du sagtest), aber das ist ziemlich unwahrscheinlich. – Eduardo

1

REMOTE_ADDR wird nicht vom Client gesendet, sondern vom Server festgelegt. Während es technisch möglich ist, eine IP-Adresse auf Netzwerkebene zu fälschen, muss der Angreifer blind arbeiten. Der schwierigste Teil ist das Erraten der . (Unter Coldfusion ist es übrigens another story.)

Wie andere bereits gesagt haben, verwenden Sie vorbereitete Anweisungen und Sie müssen sich keine Gedanken über SQL-Injection machen (obwohl andere Arten von Injektionsattacken möglich sind).

+1

Interessant, ich glaube nicht, dass es sogar wirklich überhaupt möglich war – Cyclone

+0

Beachten Sie, dass IP-Spoofing funktioniert nicht als Vektor für die SQL-Injektion, es bedeutet nur, dass Sie nicht sicher wissen können REMOTE_ADDR ist die Adresse des Computers hat die Anfrage gesendet. Außerdem ist das Erraten von Sequenznummern nicht einfach. Auf OpenBSD, das mit einer zufälligen Zahl beginnt, ist es grundsätzlich unmöglich. – outis

1

Für Effizienz und Sicherheit möchten Sie möglicherweise speichern und arbeiten mit IPs als Ints in Ihrer Datenbank.

Die direkte Möglichkeit zum Speichern von IP-Adressen besteht darin, ein VARCHAR-Feld in Ihrer DB zu verwenden. Eine andere Möglichkeit, IPs darzustellen, ist jedoch eine ganze Zahl. Wenn Sie die bereitgestellte IP-Adresse auf diese Weise konvertieren, wird dies bereinigt und Ihr Speicher und Ihre Anfragen werden effizienter. Das Speichern eines INT nimmt in einer Datenbank weniger Platz in Anspruch und funktioniert besser für die Indexierung, und ich glaube, dass das Zwischenspeichern von Abfragen möglich ist.

Check out ip2long und long2ip für PHP-Funktionen zu konvertieren, und inet_aton und inet_ntoa, um es in MySQL zu tun.

So könnte der Prozess gehen wie

$user_ip=ip2long($_SERVER['REMOTE_ADDR']); 
if(!$user_ip){ //returned false due to odd input 
    echo 'wtf, yo'; 
    } 
else{ 
    //do your query 
    } 

Sie auch eine IP sanieren können und halten es in der ursprünglichen gepunktete Quad Form durch die zwei

$user_ip=long2ip(ip2long($_SERVER['REMOTE_ADDR'])); 
+0

Vielleicht möchten Sie Ihren Codierungsstil verbessern. $ _SERVER [REMOTE_ADDR] ist schrecklich. –

+0

Danke, aus irgendeinem Grund dachte ich, das waren nicht-quoted Konstanten oder etwas. Ja, ich sollte die Anführungszeichen einschließen, also habe ich meine Antwort aktualisiert. Ich denke nicht wirklich, dass es eine Frage des Programmierstils ist. – JAL

9

Kombinieren Sie nicht verlassen können REMOTE_ADDR ist wahr ... es könnte die falsche Adresse sein, aufgrund von Anonymisierungs-Proxies oder einem solchen Trick. Sie können darauf verlassen, dass es immer eine IP-Adresse ist, so SQL-Injektion von diesem Pfad ist unmöglich.

Ganz unten im Stapel, der von der Quelladresse der Pakete konvertiert wurde, die die TCP-Verbindung zu Ihrem Server herstellen. Das bedeutet a) es muss eine IP-Adresse sein und b) es muss zurück zum Client geleitet werden, damit die Verbindung überhaupt zustande kommt.

+1

IMO das ist die echte Antwort. Wenn ich einen Pfennig für jede parametrisierte Anfragepredigt hätte, LOL. –