Warum sollte mysql_real_escape_string () SQL Injection nicht vermeiden?

8

Ich habe Leute sagen hören (in Bezug auf C # / SQL Server, sondern auch in Bezug auf PHP / MySql): Strings nicht manuell entkommen - verwenden Sie stattdessen gespeicherte Prozeduren .

Ok, ich kann diesen Vorschlag akzeptieren, aber warum? Viele sagen (einschließlich auf SO) mysql_real_escape_string() ist ziemlich genug, mysql_real_escape_string() ist gut, mysql_real_escape_string() ist die erste Art des Schutzes.

Warum? Gibt es einen Fall, in dem mysql_real_escape_string() fehlschlagen kann? Mindestens eine ... Ich brauche nicht viele:)

    
markzzz 19.12.2011, 11:48
quelle

5 Antworten

9

Wenn mysql_real_escape_string FEHLER :

%Vor%

Wenn $_GET['user_id'] auf 1 OR 1 = 1 gesetzt ist, gibt es keine speziellen Zeichen und es wird nicht gefiltert.

Das Ergebnis: Alle Zeilen werden zurückgegeben.

Es wird schlimmer. Wie wäre es damit ... Was ist, wenn $_GET['user_id'] auf 1 oder is_admin = 1 gesetzt ist?

Die Funktion ist nur für die Verwendung in einfachen Anführungszeichen vorgesehen.

    
Moz Morris 19.12.2011 12:32
quelle
3

Es gibt zwei Dinge, die mit mysql_real_escape_string schief gehen können:

  • Sie können vergessen, es zu benutzen
  • Wenn Sie bestimmte Multibyte-Verbindungscodierungen verwenden und diese Codierungen mit SET NAMES anstelle von mysql_set_charset wie es sich gehört, kann es dich trotzdem verwundbar machen

Aktualisierung:

  • Sie sind mit UTF-8 sicher (obwohl das nicht bedeutet, dass Sie SET NAMES weiter verwenden sollten!)
  • Eine Erklärung finden Sie hier
Jon 19.12.2011 11:55
quelle
1

Nur für Info: mysql_real_escape_string() entkommt nicht % und _ . Dies sind Platzhalter in MySQL, wenn sie mit LIKE, GRANT, or REVOKE kombiniert werden.

    
Sudhir Bastakoti 19.12.2011 11:51
quelle
0

mysql_real_escape_string() kann fehlschlagen um die Eingabe zu bereinigen. Seit mysql_real_esacpe_string() berücksichtigt beim Säubern von Zeichenfolgen den Zeichensatz. Da ist das Problem. Sie können das Zeichen über mysql_query function ändern, indem Sie die Abfrage senden, um den Zeichensatz der Verbindung zu ändern. % Co_de% vergisst jedoch die Menge, die Sie verwenden, und einige Zeichen werden nicht korrekt angezeigt.

Das andere Ding ruft es ständig manuell an. Sogar das Einwickeln in eine Funktion ist ein P.I.T.A. weil es impliziert, dass Sie eine eigene Datenbank-Wrapper- / Datenbank-Abstraktionsschicht erstellen müssen, um Aufrufe von mysql_real_escape_string() automatisieren zu können.

Aus diesem Grund haben wir PDO in PHP, das uns hilft, all das zu verbessern und parametrisierte vorbereitete Anweisungen zu verwenden, die bevorzugte Methoden sind, um wiederkehrende Abfragen zu bearbeiten, die die Daten verändern.

>

Bereiten Sie die Anweisung vor, binden Sie die Eingabevariablen und die Eingabe wird entsprechend dem verwendeten Datenbanktreiber und dem Zeichensatz der Verbindung bereinigt. Es ist weniger Code und völlig sicher.

    
N.B. 19.12.2011 12:00
quelle
0

Es gibt nur eine Sache über mysql_real_escape_string () und SQL Injection -

Ersteres hat keine Beziehung zu letzterem.

Obwohl es paradox klingt, kann nichts wahrer sein.

Hier sind zwei Aussagen, die es beweisen

  1. Sie müssen nur in Anführungszeichen gesetzte Zeichenfolgen auslassen, da diese Funktion nichts weiter hilft.
  2. Tatsächlich müssen Sie jede Zeichenfolge, die Sie der Abfrage hinzufügen, sogar am sichersten streichen. nur weil es ein Sonderzeichen enthalten kann und somit die Abfrage durchbricht (wie ein Unfall, kein böswilliger Plot).

Somit muss diese Funktion gegebenenfalls trotz aller Gefahren und Ängste trotzdem genutzt werden. Und in jedem anderen Fall wird es nichts helfen.

Das Einzige, was ich hinzufügen muss, ist, dass vorbereitete Anweisungen auch keinen vollständigen Schutz bieten. Hier ist die Erklärung und die Empfehlungen: Ссылка

    
Your Common Sense 20.12.2011 20:20
quelle

Tags und Links