Was bedeutet es, einer Schnur zu entkommen?

84

Ich habe gelesen Muss Muss $ _SESSION ['Benutzername'] maskiert werden, bevor eine SQL-Abfrage ausgeführt wird? und es hieß "Sie müssen jede Zeichenfolge, die Sie an die SQL-Abfrage übergeben, ungeachtet ihres Ursprungs maskieren". Jetzt weiß ich, dass so etwas wirklich grundlegend ist. Eine Google-Suche ergab über 20.000 Ergebnisse. Allein Stackoverflow hatte 20 Ergebnisseiten, aber niemand erklärt tatsächlich, was das Entkommen einer Zeichenfolge ist oder wie es geht. Es wird nur angenommen. Können Sie mir helfen? Ich möchte lernen, weil ich wie immer eine Web-App in PHP mache.

Ich habe mir Folgendes angesehen: Einfügen von Escape-Zeichen , Was sind alle Escape-Zeichen in Java? , Kann einem String mit addcslashes () nicht entkommen , Escape-Zeichen , was macht mysql_real_escape_string () wirklich? , Wie kann ich doppelte Anführungszeichen aus einem String in PHP entkommen? , MySQL_real_escape_string fügt keine Schrägstriche hinzu? , entferne Escape-Sequenzen von String in PHP Ich könnte weitermachen, aber ich bin sicher, du verstehst, worum es geht. Das ist keine Faulheit.

Brett
quelle
10
PS Ich hätte einfach einen Freund fragen und mich nicht zum Narren halten können, aber ich dachte, es würde eine Menge Leute wie mich geben, die sich fragen, wovon alle reden.
Brett

Antworten:

136

Das Escapezeichen einer Zeichenfolge bedeutet, die Mehrdeutigkeit der in dieser Zeichenfolge verwendeten Anführungszeichen (und anderer Zeichen) zu verringern. Wenn Sie beispielsweise eine Zeichenfolge definieren, umgeben Sie sie normalerweise entweder in doppelte oder einfache Anführungszeichen:

"Hello World."

Aber was ist, wenn meine Zeichenfolge doppelte Anführungszeichen enthält?

"Hello "World.""

Jetzt habe ich Mehrdeutigkeiten - der Interpreter weiß nicht, wo meine Zeichenfolge endet. Wenn ich meine doppelten Anführungszeichen behalten möchte, habe ich einige Optionen. Ich könnte einfache Anführungszeichen um meine Zeichenfolge verwenden:

'Hello "World."'

Oder ich kann meinen Zitaten entkommen:

"Hello \"World.\""

Jedes Anführungszeichen, dem ein Schrägstrich vorangestellt ist , wird maskiert und als Teil des Werts der Zeichenfolge verstanden.

Wenn es um Abfragen geht, hat MySQL bestimmte Schlüsselwörter, auf die wir achten, die wir nicht in unseren Abfragen verwenden können, ohne Verwirrung zu stiften. Angenommen, wir hatten eine Wertetabelle, in der eine Spalte "Select" heißt, und wir wollten Folgendes auswählen:

SELECT select FROM myTable

Wir haben jetzt einige Unklarheiten in unsere Abfrage eingeführt. Innerhalb unserer Abfrage können wir diese Mehrdeutigkeit durch Back-Ticks reduzieren:

SELECT `select` FROM myTable

Dies beseitigt die Verwirrung, die wir durch schlechtes Urteilsvermögen bei der Auswahl von Feldnamen eingeführt haben.

Vieles davon kann für Sie erledigt werden, indem Sie einfach Ihre Werte weitergeben mysql_real_escape_string(). Im folgenden Beispiel sehen Sie, dass wir vom Benutzer übermittelte Daten über diese Funktion weiterleiten, um sicherzustellen, dass unsere Abfrage keine Probleme verursacht:

// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
            mysql_real_escape_string($user),
            mysql_real_escape_string($password));

Andere Verfahren existieren für die Flucht Strings, wie add_slashes, addcslashes, quotemetaund mehr, wenn Sie feststellen , dass , wenn das Ziel eine sichere Abfrage auszuführen ist, im Großen und Ganzen Entwickler bevorzugen mysql_real_escape_stringoder pg_escape_string(im Rahmen von PostgreSQL.

Sampson
quelle
6
Es sollte beachtet werden, dass das Durchführen eines Escape-Escapings zur Bekämpfung der Probleme von SQL Injection als schlechte Praxis angesehen wird und leicht zu Sicherheitsproblemen führen kann, wenn es nicht ordnungsgemäß ausgeführt wird (insbesondere bei bestimmten Arten von fehlerhaften Mehrbyte-Zeichenangriffen). Bitte entkommen Sie aus diesem Grund niemals einem String und verwenden Sie stattdessen parametrisierte SQL-Abfragen oder gespeicherte Prozeduren.
Cheekysoft
22

Einige Zeichen haben eine besondere Bedeutung für die von Ihnen verwendete SQL-Datenbank. Wenn diese Zeichen in einer Abfrage verwendet werden, können sie unerwartetes und / oder unbeabsichtigtes Verhalten verursachen, einschließlich der Erlaubnis eines Angreifers, Ihre Datenbank zu gefährden. Um zu verhindern, dass diese Zeichen eine Abfrage auf diese Weise beeinflussen, müssen sie maskiert oder anders ausgedrückt werden. Die Datenbank muss angewiesen werden, sie in dieser Abfrage nicht als Sonderzeichen zu behandeln.

Im Fall von mysql_real_escape_string()entweicht \x00, \n, \r, \, ', "und \x1ada diese, wenn sie nicht entkommen kann die zuvor erwähnten Probleme verursachen , die SQL - Injektionen mit einer MySQL - Datenbank enthält.

John Conde
quelle
1

Der Einfachheit halber können Sie sich den Backslash "\" als Befehl für den Interpreter zur Laufzeit vorstellen.

Zum Beispiel bei der Interpretation dieser Aussage:

$txt = "Hello world!";

während der lexikalischen Analysephase (oder wenn Aufspaltung der Anweisung in einzelne Tokens) Diese würden die Token identifiziert $, txt, =, ", Hello world!, ", und;

Der Backslash in der Zeichenfolge verursacht jedoch einen zusätzlichen Satz von Token und wird als Befehl interpretiert, etwas mit dem unmittelbar darauf folgenden Zeichen zu tun: z

$txt = "this \" is escaped";

Ergebnisse in den folgenden Token: $, txt, =, ", this, \, ", is escaped, ", und;

Der Interpreter weiß bereits (oder hat voreingestellte Routen), was zu tun ist, basierend auf dem Zeichen, das dem \Token folgt . Im Falle "davon wird es also als Zeichen und nicht als Befehl zum Ende der Zeichenfolge behandelt.

supi
quelle