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.
Antworten:
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
,quotemeta
und mehr, wenn Sie feststellen , dass , wenn das Ziel eine sichere Abfrage auszuführen ist, im Großen und Ganzen Entwickler bevorzugenmysql_real_escape_string
oderpg_escape_string
(im Rahmen von PostgreSQL.quelle
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\x1a
da diese, wenn sie nicht entkommen kann die zuvor erwähnten Probleme verursachen , die SQL - Injektionen mit einer MySQL - Datenbank enthält.quelle
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.quelle