2010-08-13 13 views
33

Kann jemand etwas Licht auf die Unterschiede zwischen diesen zwei Funktionen vergossen hat, von der PHP-Handbuchmysql_real_escape_string VS addslashes

addslashes: eine Zeichenfolge zurück mit Schrägstriche vor Zeichen, die in Datenbankabfragen angegeben werden müssen, usw. Diese Zeichen sind Apostroph ('), doppelte Anführungszeichen ("), Backslash() und NUL (das NULL-Byte)

mysql_real_escape_string. mysql_real_escape_string() ruft MySQL-Library-Funktion mysql_real_escape_string, die Schrägstriche auf die folgenden Zeichen prepends: \ x00, \ n, \ r, \, ', "und \ x1a.

von dem ich den Hauptunterschied erhalte, ist \ x00, \ n \ r \ x1a, die addslashes nicht entgeht, können Sie mir sagen, was die Bedeutung davon ist?

dank

Antwort

42

Was Sie zitieren ist wahrscheinlich aus dem doc, aber soweit ich es nicht unbedingt wahr wissen.

addslashes fügt den häufig störenden Zeichen Schrägstriche hinzu. mysql_real_escape_string entkommt, was auch immer MySQL zu entkommen braucht. Dies kann mehr oder weniger Zeichen als was addslashes kümmert sich um.

Auch mysql_real_escape_string wird nicht unbedingt Schrägstriche hinzufügen, um zu entkommen. Während ich denke, dass es funktioniert, wenn Sie es so tun, fliehen aktuelle Versionen von MySQL, indem Sie zwei von ihnen zusammensetzen, anstatt einen Schrägstrich davor zu setzen.

Ich glaube, Sie sollten immer die Escape-Funktion Ihres Datenproviders anstelle von addslashes verwenden, weil addslashes entweder zu viel oder nicht genug Arbeit für den Zweck, den Sie verwenden, tun kann. Auf der anderen Seite, mysql_real_escape_stringweiß was zu tun ist, um eine Zeichenfolge für das Einbetten in einer Abfrage vorzubereiten. Auch wenn sich die Spezifikationen dahingehend ändern, wie man den Dingen entkommen kann und plötzlich keine Backslashes mehr verwendet werden sollten, funktioniert Ihr Code immer noch, weil mysql_real_escape_string davon Kenntnis haben wird.

+3

ANSI SQL spezifiziert, dass ein einzelnes Anführungszeichen durch zwei einfache Anführungszeichen in einer Reihe dargestellt werden kann, aber mysql_real_escape_string() tut das nicht - es entkommt immer mit einem Backslash, soweit ich es gesehen habe. Wenn Sie ein Beispiel für eine MySQL-Version haben, die durch eine Verdoppelung des Anführungszeichens nicht möglich ist, wäre ich an dem Beispiel interessiert. –

+1

@BillKarwin, PHPs 'mysql_real_escape_string' ruft MySQL [mysql_real_escape_string'] (http://dev.mysql.com/doc/refman/4.1/en/mysql-real-escape-string.html) auf, das macht, was es will den Fäden entkommen. Die PHP-Dokumentation sagt nun, dass es Blackslashes verwendet, aber die MySQL-Dokumentation sagt nichts darüber aus. Ich erinnere mich, dass es irgendwann mit ''' 'anstatt mit' \' 'fliehen würde, vielleicht ist das nicht mehr der Fall, oder es erfordert bestimmte Verbindungseinstellungen (mysql_real_escape_string nimmt ein Verbindungsargument, um es danach zu überprüfen alle). – zneak

+1

Aha, ich habe getestet und herausgefunden, dass, wenn Sie 'SQL_MODE = NO_BACKSLASH_ESCAPES 'setzen, es sich so verhält, wie Sie es beschreiben. Meine Verwirrung war, weil mysqldump die doppelten Anführungszeichen immer noch nicht tut, selbst wenn Sie diesen SQL-Modus eingestellt haben. Dies bedeutet, dass Sie eine Speicherabbilddatei erstellen können, die nicht auf dem Server, der sie generiert hat, erneut importiert werden kann. –

0

Beide ignorieren und nur parametrisierte Abfragen verwenden. Es sei denn, Sie mögen Injektionsangriffe.

+0

Können Sie zur Vollständigkeit auf die Funktionen/Klassen verweisen, zu denen gewechselt werden soll? Ich komme von einem Postgres-Hintergrund, also weiß ich, um ps_ Funktionen oder PDO zu verwenden, aber ich weiß nicht, was parametrisierte Abfragen für einen MySQL-Benutzer unterstützt. – Tom

+6

Die konsistente Verwendung von mysql_real_escape_string verhindert Injektionsangriffe. –

+2

Vage Verallgemeinerungen sind nicht sehr hilfreich. – cbednarski

13

mysql_real_escape_string() berücksichtigt auch den Zeichensatz, der von der aktuellen Verbindung zur Datenbank verwendet wird.

Die PHP-Funktion mysql_real_escape_string() verwendet die MySQL-C-API-Funktion mit dem gleichen Namen: http://dev.mysql.com/doc/refman/5.1/en/mysql-real-escape-string.html

Auch addslashes() Versus mysql_real_escape_string() von den bekannten PHP-Sicherheitsexperten Chris Shiflett, für eine Demonstration zu lesen, dass Sie SQL-Injection-Angriffe zu bekommen, auch wenn Sie Verwenden Sie addslashes().


Andere empfehlen die Verwendung von Abfrageparametern, und Sie müssen dann keine dynamischen Werte meiden. Ich empfehle das auch, aber in PHP müssten Sie zu PDO oder ext/mysqli wechseln, weil die einfache ext/mysql API Abfrageparameter nicht unterstützt.

Es kann auch Fälle geben, in denen Sie keine Abfrageparameter für einen dynamischen Zeichenfolgenwert verwenden können, z. B. Ihr Suchmuster in einer Volltextsuche.

+1

+1 für das Lesen von Material. Es ist gut, über diese Themen informiert zu sein. – cbednarski

+0

"muss ich nach PDO switch" klingt wie ein Vorteil für mich! – Tom

+0

@Tom: Ja, ich bevorzuge PDO und ich empfehle es. Aber wenn ein Projekt bereits viel Code mit ext/mysql hat, ist es schwer, die Zeit zu rechtfertigen, alles neu zu schreiben. –

1

Es gab eine Reihe von Geschichte mit mysql_escape_string und mysql_real_escape_string.Sie waren beide Versuche, einen "allgemeinen" Fluchtmechanismus bereitzustellen, der die Wahrscheinlichkeit von SQL-Injektionsangriffen minimieren würde.

mysql_real_escape_string und addslashes sind ok, wenn sie das sind, was Sie wirklich brauchen - aber sie sind es wahrscheinlich nicht.

Wie @afrazier sagt, Sie prepared statements

1

Statt vorbereiten quer "ies mit PDO können Sie diese verwenden, während Ihre Anwendung MySQLi verwendet (Vorsicht! "Verwenden sollte ich" an und von Mysql")

$nick = $connect->real_escape_string($nick); 
$nick= addcslashes($nick, '%_'); 

$pass = $connect->real_escape_string($pass); 
$pass = addcslashes($pass, '%_'); 
Verwandte Themen