Frage

Laut php.net sollte ich verwenden mysql_real_escape_string() und ausschalten magische Zitate, weil es veraltet ist.

Also habe ich es ausgeschaltet und mysql_real_escape_string() verwendet, aber reicht es aus, es genau wie im folgenden Code zu verwenden?

$value = "It's Time!";
$escaped_value = mysql_real_escape_string($value);

mysql_query("INSERT INTO table (column, column2) VALUES ('{$escaped_value}', "0")");

Wenn ich die Daten in der Datenbank überprüfe, sehen sie genauso aus wie in $value "It's Time" und nicht "It\'s Time".Ist das normal?Sollte dies nicht einen Schrägstrich vor den Anführungszeichen hinzufügen?

War es hilfreich?

Lösung

Das ist das richtige Verhalten und es funktioniert! Zitate werden in der Abfrage entkommen, nicht in der Datenbank. 'In der SQL -Abfrage muss in der Datenbank in' in "konvertiert werden.

Sie entkommen Strings, sodass die SQL -Abfrage nicht durcheinander geraten ist, und können Zitate in die Datenbank eingeben, ohne dass die SQL -Abfrage sie als Steuerzeichen interpretiert.

Ihre entkommene Frage wäre:

mysql_query("INSERT INTO table (column, column2) VALUES ('It\'s time', "0")");

Ihre Datenbankdaten sollten "Es ist Zeit" sein.

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

mysql_query("INSERT INTO table (column, column2) VALUES ('It's time', "0")");

Es wird einen Fehler in Bezug auf "S -Zeit" ausspucken (weil es nur bis zum nächsten Zitatcharakter interpretiert wird und nur 'es' sehen wird) und "Es ist Zeit!" ist nur eine harmlose Schnur, aber viele Angriffe können daraus abgeleitet werden, wenn Sie Ihren Charakteren nicht entkommen.

Andere Tipps

Kurze Antwort

Das ist richtig.

Lange Antwort

Das ist richtig, aber Ihre Frage deutet darauf hin, dass Sie nicht genau verstehen, was hier vor sich geht.Hier ist Ihre Anfrage:

INSERT INTO table (column, column2) VALUES ('{$escaped_value}', "0")

Mal sehen, was passiert, wenn Sie nicht entkommen und der Benutzer die folgenden Daten eingibt:

Eve'

Denken Sie daran, dass Sie lediglich einen String an MySQL übergeben. Das Einfügen erfolgt durch die String-Verarbeitung von PHP.Das bedeutet, dass in diesem Fall die an mysql_query gesendete Abfrage lautet:

INSERT INTO table (column, column2) VALUES ('Eve'', "0")

Das ist ein Syntaxfehler und würde den Seitenfehler auslösen.Wenn nun ein Benutzer wie ich (d. h.ein Bastard, der dir den Tag zur Hölle machen will :D) Wenn du eines davon siehst, wissen wir, dass es Zeit zum Spielen ist.Was passiert, wenn die folgenden Daten von einem Benutzer angegeben werden?

Eve', "0"); DROP TABLE table--

Unsere Anfrage wird erweitert auf:

INSERT INTO table (column, column2) VALUES ('Eve', "0"); DROP TABLE table--', "0")

Dies ist kein Syntaxfehler, aber problematisch ...Wir führen jetzt eine Abfrage aus, die wir nie beabsichtigt hatten!(Falls Sie es nicht erkennen: „--“ bezeichnet einen Kommentar in SQL, d. h.„Alles nach diesem Punkt ignorieren“).

Das kann in genau diesem Fall nicht passieren (mysql_query unterstützt nicht mehrere Abfragen), aber es ist die Art von Angriff, die Sie verhindern möchten – eine Klasse von Angriffen, die als bekannt ist SQL-Injektion.Mal sehen, was passiert, wenn Sie mysql_real_escape_string verwenden!

Die eingegebenen Daten werden zu:

Eve\', \"0\"); DROP TABLE table--

Das bedeutet, dass unsere Abfragezeichenfolge wie folgt aussieht:

INSERT INTO table (column, column2) VALUES ('Eve\', \"0\"); DROP TABLE table--}', "0")

Was in Ordnung ist!Die vom Benutzer eingegebenen Daten werden in der Datenbank gespeichert, in der sie sie eingegeben haben.Nicht ohne Anführungszeichen und nicht mit zusätzlichen Backslashes, sondern so, wie sie es eingegeben haben. Das ist wichtig.Wenn Sie die Daten auf andere Weise speichern, werden Sie später auf Probleme mit De-Escape oder Double-Escape stoßen.Darüber hinaus wird das Hinzufügen zusätzlicher Schrägstriche oder Ähnliches häufig auf die eine oder andere Weise für die Benutzer sichtbar und ist ein großes Warnsignal dafür, dass Dinge möglicherweise nicht ordnungsgemäß maskiert werden.Sie möchten vermeiden, das Falsche zu tun, und Sie möchten insbesondere vermeiden, das Falsche zu tun und Werbung dafür zu machen, was mich zum nächsten Abschnitt bringt:

Alternativen zum Escape Ihrer Daten

  1. Magische Zitate.Wie Sie bemerkt haben, ist dies veraltet (und das aus gutem Grund). Vermeiden Sie es.
  2. Entkommen Sie Ihren Daten nicht.Ich würde von dieser Option abraten.
  3. Entfernen Sie fehlerhafte Zeichen aus der Eingabe.In fast allen Situationen ärgerlich, sollten Sie speichern, was Benutzer eingeben, und nicht, was technisch einfach zu speichern ist.
  4. Ungültige Zeichen aus der Eingabe ausschließen.Manchmal akzeptabel (Kreditkartennummernfelder erfordern keine Anführungszeichen), manchmal nervig, manchmal ein massives Warnzeichen (z. B. bei einem Passwortfeld)
  5. Vorbereitete Aussagen.Ich sagte, dass das „Ausfüllen“ der Variablen in der Zeichenfolge von PHP durchgeführt wurde und MySQL nur eine Abfragezeichenfolge erhielt, weshalb ein Escape erforderlich war.Vorbereitete Anweisungen nehmen Ihnen diese Arbeit ab, da sie etwas intelligenter sind. Die Verwendung einer vorbereiteten Anweisung würde in etwa so aussehen (Warnung:Pseudocode):

    $statement = $db->prepare('INSERT INTO table (column, columns2) VALUES ("%1", "%2")');$result = $statement->execute($value1, $value2);

Es gibt eine nette Frage zum Stapelüberlauf Auf SQL-Escape-Methoden und die Antworten dort gehen wir ausführlicher ein, also möchten Sie das vielleicht lesen.

Persönlich ist dies die Option, die mir gefällt.Sie können nicht vergessen, eine Variable zu maskieren und sie auf diese Weise in die Datenbank einzufügen – entweder werden die Werte ordnungsgemäß gemarshallt, oder sie gelangen nicht in die Nähe der Datenbank, es gibt keine Möglichkeit auf halbem Weg.Das heißt, vorausgesetzt, Sie erzwingen, dass alle Abfragen vorbereitete Anweisungen und keine Zeichenfolgenverkettung durchlaufen

$db->prepare('INSERT INTO table VALUES('.$value.')'))

Erledigt.Meiner Meinung nach ist dies einfacher, als den Überblick darüber zu behalten, welche Variablen bereinigt werden und welche nicht.Manche Leute entkommen Strings gerne, sobald sie vom Benutzer kommen, aber das wäre sehr umständlich, wenn sie irgendwo anders als in die Datenbank gehen könnten – zurück in den HTML-Code, in den Memcache usw.Wenn Sie es selbst machen wollen, würde ich Ihnen vielleicht eine ungarische Notation vorschlagen, zum Beispiel:

$uValue = $_POST['value'];
$sValue = escape($uValue);
$db->query('INSERT INTO table VALUES(' . $sValue .')');

Ich habe diese Idee zum ersten Mal in einem ausgezeichneten Artikel gesehen Falschen Code falsch aussehen lassen von Joel Spolsky.

Abschluss

Hoffentlich fühlen Sie sich jetzt besser darauf vorbereitet, injektionssichere Websites zu erstellen.Viel Glück bei der von Ihnen gewählten Methode und viel Spaß dabei, sicherzustellen, dass Sie immer alle Benutzereingaben umgehen, bevor sie in die Datenbank gelangen!;)

mysql_real_escape_string () reicht normalerweise aus, um zu verhindern SQL-Injektion.

Sie sollten auch numerische Werte filtern, die Sie vom Benutzer erhalten (indem Sie Intval ()) verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top