Fluchtende Zitate in SQL

7

Ich bin etwas verwirrt über dieses Thema, also habe ich beschlossen, von euch nachzufragen:)

Ab php.net sollte ich mysql_real_escape_string () verwenden und drehen off magische Zitate , weil es veraltet ist.

Also habe ich abgeschaltet und ich benutze mysql_real_escape_string (), aber reicht es, es einfach so zu benutzen?:

%Vor%

Wenn ich die Daten in der Datenbank überprüfe sieht es genauso aus wie in $ value also "It's Time" und nicht "It\'s Time" , ist das normal sollte das nicht einen Schrägstrich vor den Anführungszeichen hinzufügen?

    
Adam 01.02.2011, 13:37
quelle

3 Antworten

10

Das ist das richtige Verhalten, es funktioniert! Angebote werden in der Abfrage und nicht in der Datenbank maskiert. \ 'in der SQL-Abfrage muss in' innerhalb der Datenbank konvertiert werden. Sie umgehen Zeichenfolgen, damit die SQL-Abfrage nicht durcheinander gebracht wird und Sie können Anführungszeichen für die Datenbank eingeben, ohne dass die SQL-Abfrage sie als Steuerzeichen interpretiert.

Sie maskiert Abfrage wäre:

%Vor%

Ihre Datenbankdaten sollten "Es ist Zeit" sein.

Wenn es nicht entkommen würde, wäre es:

%Vor%

Es wird einen Fehler bezüglich "s Zeit" ausspucken (weil es nur bis zum nächsten Anführungszeichen interpretiert und nur "Es" sehen wird.) Und "Es ist Zeit!" ist nur eine harmlose Zeichenkette, aber viele Angriffe könnten davon herrühren, wenn du deinen Charakteren nicht entkommst.

    
kaoD 01.02.2011, 13:39
quelle
10

Kurze Antwort

Das ist richtig.

Lange Antwort

Das ist richtig, aber Ihre Frage zeigt einen Mangel an Verständnis für das, was hier vor sich geht. Hier ist Ihre Frage:

%Vor%

Lassen Sie uns sehen, was passiert, wenn Sie nicht entkommen und der Benutzer gibt folgende Daten ein:

%Vor%

Denken Sie daran, dass Sie nur eine Zeichenfolge an MySQL übergeben, die Einfügung erfolgt durch die PHP-String-Verarbeitung. Dies bedeutet, dass in diesem Fall die an mysql_query gesendete Abfrage lautet:

%Vor%

Was ein Syntaxfehler ist und den Seitenfehler ausschließen würde. Jetzt, wenn ein Benutzer wie ich (d. H. Ein Bastard, der deinen Tag zu einem Elend machen will: D) einen von diesen entdeckt, wissen wir, dass es Zeit ist zu spielen. Was passiert, wenn die folgenden Daten von einem Benutzer bereitgestellt werden?

%Vor%

Unsere Anfrage wird erweitert auf:

%Vor%

Dies ist kein Syntaxfehler, aber es ist problematisch ... wir führen jetzt eine Abfrage durch, die wir nie beabsichtigt haben! (Falls Sie es nicht erkennen, bedeutet "-" einen Kommentar in SQL, d. H. "Alles nach diesem Punkt ignorieren").

Das kann jetzt nicht in genau dieser Instanz passieren ( mysql_query unterstützt nicht mehrere Abfragen ), aber es ist die Art von Angriff, die Sie verhindern wollen - eine Klasse von Angriffen, bekannt als SQL Injection . Mal sehen, was passiert, wenn Sie mysql_real_escape_string verwenden!

Die eingegebenen Daten werden:

%Vor%

Das bedeutet, dass unsere Abfragezeichenfolge wie folgt aussieht:

%Vor%

Was ist in Ordnung! Die Daten, die der Benutzer eingegeben hat, werden in der Datenbank gespeichert, so wie sie eingegeben wurden. Nicht ohne Anführungszeichen und nicht mit zusätzlichen Backslashes, sondern wie sie eingegeben wurden. Das ist wichtig . Wenn Sie die Daten auf andere Weise speichern, treten später Probleme auf, die zu einem De- oder Double-Escaping führen. Darüber hinaus endet das Hinzufügen von zusätzlichen Schrägstrichen oder ähnlichem oft auf die eine oder andere Weise bei den Benutzern, und es ist ein riesiges Warnsignal dafür, dass Dinge nicht richtig entkommt. Sie wollen vermeiden, das Falsche zu tun, und Sie wollen vor allem vermeiden, das Falsche zu tun und darüber zu werben, was mich zum nächsten Abschnitt führt:

Alternativen zum Entkommen Ihrer Daten

  1. Magische Zitate. Wie Sie angemerkt haben, veraltet (und mit gutem Grund), vermeiden Sie.
  2. Entkomme deinen Daten nicht. Ich würde von dieser Option abraten.
  3. Streiche schlechte Zeichen von der Eingabe. Ärgerlich in fast allen Situationen, sollten Sie speichern, was Benutzer eingeben, nicht was technisch einfach zu speichern ist.
  4. Verbieten Sie ungültige Zeichen bei der Eingabe. Manchmal akzeptabel (Kreditkartennummernfelder müssen nicht mit Anführungszeichen umgehen), manchmal nervig, manchmal ein massives Warnzeichen (zB bei einem Passwortfeld)
  5. Vorbereitete Aussagen. Ich sagte, dass das "Ausfüllen" von Variablen in der Zeichenkette durch PHP erfolgte und MySQL nur eine Abfrage-Zeichenkette erhielt, daher die Notwendigkeit zu entkommen. Vorbereitete Anweisungen entlasten diese Arbeit, indem sie etwas intelligenter sind, und die Verwendung einer vorbereiteten Anweisung würde in etwa so aussehen (Warnung: Pseudocode):

    $ statement = $ db- & gt; vorbereiten ('INSERT INTO table (column, column2) VALUES ("% 1", "% 2")'); $ result = $ statement- & gt; Ausführen ($ value1, $ value2);

Es gibt eine nette StackOverflow-Frage zu SQL-Escaping-Methoden und die Antworten dort gehen in die Tiefe, so dass Sie das vielleicht lesen möchten.

Persönlich ist dies die Option, die ich mag. Sie können nicht vergessen, eine Variable zu entkommen und sie so in die Datenbank einzufügen - entweder werden die Werte korrekt gemarshallt oder sie kommen nicht in die Nähe der Datenbank, es gibt keine Option auf halbem Wege. Das heißt, vorausgesetzt, Sie erzwingen, dass alle Abfragen vorbereitete Anweisungen durchlaufen und keine String-Verkettung wie

%Vor%

Ist fertig. Meiner Meinung nach ist dies einfacher als zu verfolgen, welche Variablen bereinigt werden und welche nicht. Einige Leute mögen es, Strings zu entkommen, sobald sie vom Benutzer kommen, aber das ist sehr peinlich, wenn sie irgendwo anders als in die Datenbank gehen könnten - zurück in den HTML, in Memcache, etc. Wenn Sie es selbst tun, könnte ich schlagen Sie eine ungarische Notation vor, zum Beispiel:

%Vor%

Ich sah diese Idee zuerst in einem ausgezeichneten Artikel Falschen Code falsch machen von Joel Spolsky machen.

>

Fazit

Hoffentlich fühlen Sie sich besser vorbereitet, um jetzt injektionsgesicherte Websites zu erstellen. Viel Glück mit der von Ihnen gewählten Methode und viel Spaß dabei, sicherzustellen, dass Sie immer alle Benutzereingaben verlassen, bevor sie die Datenbank erreichen! ;)

    
ZoFreX 01.02.2011 14:01
quelle
0

mysql_real_escape_string () reicht normalerweise aus, um SQLI zu verhindern.
Sie sollten auch numerische Werte filtern, die Sie vom Benutzer erhalten (mithilfe von intval ()).

    
Ratinho 01.02.2011 13:40
quelle