2008-09-18 6 views
9

mysql_real_escape_string und addslashes werden beide verwendet, um Daten vor der Datenbankabfrage zu entkommen, was ist der Unterschied? (Diese Frage nicht etwa ist Abfragen/PDO/mysqli parametrisiert)Was ist der Unterschied zwischen mysql_real_escape_string und addslashes?

+0

Ähnlich wie diese Frage: http://stackoverflow.com/questions/534742/what-does-mysql- real-escape-string-do-dass-addslashes-doesnt – Zack

Antwort

14

string mysql_real_escape_string (string $unescaped_string [, resource $link_identifier ])
mysql_real_escape_string() ruft MySQLs Bibliotheksfunktion mysql_real_escape_string, die Schrägstriche auf die folgenden Zeichen prepends:. \ X00, \ n \ r, \,‘,", und \ X1a

string addslashes (string $str)
Gibt eine Zeichenfolge mit umgekehrten Schrägstrichen vor Zeichen zurück, die in Datenbankabfragen usw. zitiert werden müssen. Diese Zeichen sind ein einfaches Anführungszeichen ('), doppelte Anführungszeichen ("), umgekehrter Schrägstrich (\) und NUL (das NULL-Byte).

Sie wirken sich auf verschiedene Zeichen aus. mysql_real_escape_string ist spezifisch für MySQL. Addslashes ist nur eine allgemeine Funktion, die für andere Dinge sowie für MySQL gelten kann.

+0

Sie kopierten nur Definitionen und nicht wirklich die Frage, was ist eigentlich Unterschied, das heißt, was sind Verwendungen und was sind Fallstricke, in welcher Weise ist eine Funktion besser als der andere. Bessere Antwort ist hier: http://Stackoverflow.com/a/3473077/1335996 –

+1

Lesen Sie noch einmal und Sie werden den letzten Absatz, wo ich festgestellt, dass verschiedene Zeichen betroffen sind, die die zitierte Dokumentation zusammenfasst. Sie werden sehen, dass die Frage beantwortet wurde. In der Frage wurde nicht gefragt, "warum einer besser ist als der andere" oder "Vorteile und Fallstricke". Die verknüpfte Antwort geht tiefer und es lohnt sich zu lesen, wenn das obige noch nicht klar für Sie ist, aber ich sehe nicht, dass es notwendig ist, Löcher in meiner Antwort zu suchen. –

0

Es scheint, dass mysql_real_escape_string ist binary safe - In der Dokumentation:

Wenn binäre Daten eingeführt werden soll, wird diese Funktion verwendet werden muss.

Ich denke, es ist wahrscheinlich sicherer, immer mysql_real_escape_string als addslashes zu verwenden.

+1

Ich denke, es ist wahrscheinlich sicherer * parametrisierte Abfragen zu verwenden *, obwohl der Fragesteller das ausgeschlossen hat. –

+0

@Hank Gay: einverstanden, aber der beiden, mysql_real_escape_string ist orerable, –

0

mysql_real_escape_string sollte verwendet werden, wenn Sie binäre Daten empfangen, addslashes ist für Texteingabe.

können Sie die Unterschiede sehen hier: mysql-real-escape-string und addslashes

6

mysql_real_escape_string() haben den zusätzlichen Vorteil der Texteingabe korrekt in Bezug auf den Zeichensatz einer Datenbank über die optionalen link_identifier Parameter zu entkommen.

Zeichensatzbewusstsein ist eine kritische Unterscheidung. addslashes() fügt vor jeder Acht-Bit-Binärdarstellung eines jeden zu maskierenden Zeichens einen Schrägstrich hinzu. Wenn Sie irgendeine Form von Multibyte-Zeichensatz verwenden, ist es möglich, obwohl wahrscheinlich nur durch ein schlechtes Design des Zeichensatzes, dass eine oder beide Hälften einer 16- oder 32-Bit-Zeichendarstellung mit den acht Bits identisch sind eines Zeichens addslashes() würde einen Schrägstrich hinzufügen.

In solchen Fällen können Sie einen Schrägstrich vor einem Zeichen erhalten, das nicht maskiert werden sollte, oder schlimmer noch, Sie könnten einen Schrägstrich in der Mitte eines sechzehn (oder zweiunddreißig) Bit-Zeichens erhalten, das die Daten verfälschen würde .

Wenn Sie Inhalt in Datenbankabfragen fliehen müssen, sollten Sie immer mysql_real_escape_string() verwenden, wo es möglich ist. addslashes() ist in Ordnung, wenn Sie sicher sind, dass die Datenbank oder Tabelle nur ASCII-Codierung mit 7 oder 8 Bit verwendet.

1

Fall 1:

$str = "input's data"; 

print mysql_real_escape_string($str);  input\'s data 

print addslashes($str);     input\'s data; 

Fall 2:

$str = "input\'s data"; 

print mysql_real_escape_string($str);  input\'s data 

print addslashes($str);     input\\'s data; 
Verwandte Themen