Bin ich vor einer mysql-Injektion sicher? [Duplikat]

7

Ist das gut genug, um eine SQL-Injektion zu vermeiden?

%Vor%     
user342391 28.08.2010, 15:32
quelle

4 Antworten

9

Ich denke, dass Sie zwei Sicherheitsprobleme verwirren: SQL-Injektion und Cross-Site-Scripting (XSS) .

Eine Website ist anfällig für SQL-Injection, wenn nicht ordnungsgemäß bereinigte Benutzereingaben in einer SQL-Abfrage verwendet werden, die an die SQL-Datenbank gesendet wird. Dieser Code führt zum Beispiel eine SQL Injection-Schwachstelle ein:

%Vor%

Dieses Problem lässt sich leicht beheben, indem die Benutzereingabe mit einer Funktion wie mysql_real_escape_string :

entkommt %Vor%

Das ist alles, was Sie tun müssen, aber der schwierige Teil besteht darin, sich daran zu erinnern, dies für jede Benutzereingabe zu tun, die in einer SQL-Anweisung verwendet wird.

Eine Website ist anfällig für Cross-Site-Scripting, wenn Benutzereingaben in HTML verwendet werden, die an einen Client gesendet werden. Dieser Code führt beispielsweise eine XSS-Sicherheitsanfälligkeit ein:

%Vor%

Eine XSS-Schwachstelle wird behoben, indem die Benutzereingabe mit einer Funktion wie htmlspecialchars entkoppelt wird :

%Vor%

Auch dies ist leicht zu tun, aber leicht vergessen.

Normalerweise werden Benutzereingaben, die in einer Datenbank gespeichert werden, um HTML zu einem späteren Zeitpunkt zurückzusenden, unverändert gespeichert. Das heißt, nur mysql_real_escape_string wird verwendet. Sie können jedoch Benutzereingaben umgehen, um XSS zu verhindern, und anschließend die XSS-sichere Zeichenfolge umgehen, um SQL-Injection zu verhindern:

%Vor%

Der Vorteil ist, dass Sie nicht vergessen müssen, Werte aus der Datenbank mit htmlspecialchars zu entfernen, bevor Sie sie in HTML schreiben. Der Nachteil ist, dass einige Werte mit verschiedenen Funktionen maskiert werden müssen. Zum Beispiel würde ein Benutzername wahrscheinlich mit htmlspecialchars maskiert, aber eine "postmessage" könnte BBcode, Markdown oder eine Teilmenge von HTML erlauben. Wenn Sie alle Eingaben maskiert haben, um XSS zu vermeiden, müssen Sie Werte aus der Datenbank mit z. B. htmlspecialchars_decode .

Ein Problem besteht darin, dass das Unscaping der gesperrten Zeichenfolge nicht immer die ursprüngliche Zeichenfolge zurückgibt ( unescape(escape($orig)) ist nicht unbedingt dasselbe wie $orig ). Selbst mit htmlspecialchars und htmlspecialchars_decode wird dieses Problem durch Verwendung eines anderen Anführungsstils verursacht. Ein anderes Beispiel ist, dass, wenn strip_tags verwendet wird, Informationen unwiederbringlich entfernt werden; Sie können strip_tags nicht rückgängig machen. Daher entscheiden sich viele Entwickler dafür, mysql_real_escape_string nur zum Speichern von Werten in der Datenbank und htmlspecialchars (oder was auch immer) zu verwenden, um eine Zeichenfolge aus der Datenbank vorzubereiten, die in HTML verwendet werden soll.

    
Daniel Trebbien 28.08.2010, 16:12
quelle
21

mysql_real_escape_string() ist die einzige Methode, die Sie hier brauchen.
Bevor Sie Daten in Ihre Datenbank einfügen, sollten Sie weder htmlentities() noch urlencode() ausführen. Bei diesen Methoden handelt es sich normalerweise um Code beim Rendern der Ansicht, die Sie Ihren Benutzern anbieten.

Eine bessere Möglichkeit, SQL Injection zu vermeiden, ist die Verwendung von vorbereiteten Anweisungen .

Ressourcen:

Zum selben Thema:

Colin Hebert 28.08.2010 15:33
quelle
1

Ja, aber es gibt einen Grund, mysql_real_escape_string () nicht zu verwenden. Zuerst ist es ein Schmerz zu tippen. Zweitens müssen Sie daran denken, es jedes Mal zu verwenden. Drittens macht es deinen Code hässlich. Viertens müssen Sie daran denken, Ihre Strings zu zitieren. Fünftens ist es schwieriger, auf diese Weise Blobs in eine db einzufügen.

PDO-Lernen wird Ihr Leben auf lange Sicht verbessern. Es ist schwieriger zu lernen als einfach mysql_real_escape_string () zu verwenden, aber die langfristigen Vorteile überwiegen die Unannehmlichkeit einer Lernkurve.

    
Jason Thompson 28.08.2010 15:51
quelle
1

Sie sollten auch sicherstellen, dass Sie "an der Stelle verwenden, an der Sie Ihren Code einfügen.

Zum Beispiel, wenn Sie

tun %Vor%

mysql_real_escape_string würde nichts helfen. Weil $ _POST ['userid'] nicht von '.

umgeben ist

Das solltest du also tun

%Vor%

stattdessen.

Wenn Sie also mysql_real_escape_string für Ihre Variablen verwenden, heißt das nicht automatisch, dass sie in jeder Abfrage sicher sind.

Ein anderer Ansatz wäre die Verwendung von vorbereiteten Anweisungen.

    
JochenJung 28.08.2010 15:43
quelle

Tags und Links