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:)
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.
Es gibt zwei Dinge, die mit mysql_real_escape_string
schief gehen können:
SET NAMES
anstelle von mysql_set_charset
wie es sich gehört, kann es dich trotzdem verwundbar machen Aktualisierung:
SET NAMES
weiter verwenden sollten!) 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.
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.
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
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: Ссылка
Tags und Links php mysql security sql-injection