special - php escape()




Was macht mysql_real_escape_string() das addslashes() nicht? (8)

Warum brauchen wir DB-spezifische Funktionen wie mysql_real_escape_string ()? Was kann es tun, dass addslashes () nicht?

Ignorieren Sie im Moment die überlegene Alternative der parametrisierten Abfragen, ist eine Webanwendung, die addslashes () ausschließlich noch anfällig für SQL-Injection verwendet, und wenn ja, wie?


Warum brauchen wir DB-spezifische Funktionen wie mysql_real_escape_string ()?

Eigentlich tun wir die meiste Zeit nicht.
Diese Funktion wird für einige extrem seltene Kodierungen benötigt und um mysql Logs und Dumps zu verschönern.

ist eine Webanwendung, die addslashes () ausschließlich noch anfällig für SQL-Injection verwendet?

Solange es einen Single-Byte-Zeichensatz oder utf8 verwendet - ist es mit addslashes () vollkommen sicher.

Was kann es tun, dass addslashes () nicht?

Es kann das SQL- String-Literal bei einigen seltenen Kodierungen schützen.

Allerdings kann es das nicht alleine tun. Eine korrekte Kodierung muss zuerst mit der Funktion mysql_set_charset() werden. Wenn diese Funktion nicht verwendet wurde, verhält sich mysql_real_escape_string() genau wie addslashes() in Bezug auf die Zeichensatzbehandlung - es würde überhaupt keinen Unterschied geben .


Addslashes ist im Allgemeinen nicht gut genug, wenn es sich um Multibyte-codierte Strings handelt.


Die mysql_real_escape_string Funktion von PHP fragt mysql mehr oder weniger, welche Zeichen maskiert werden müssen , wobei die addslashes Funktion nur einen Backslash vor jedem einzelnen Anführungszeichen ('), doppelte Anführungszeichen ("), Backslash () oder NUL (das NULL-Byte) -Zeichen.

Die zwei praktischen Effekte sind, dass Addslashes mit Multibyte-Zeichen nicht gut funktionieren, und, noch wichtiger, indem Sie mysql fragen, welche Zeichen maskiert werden müssen, vermeiden Sie eine mögliche zukünftige Kompatibilität. Assslashes zu benutzen ist ein bisschen wie ein paar spezielle Charaktere in die Escape-Sequenz zu kodieren.


Es fügt Schrägstriche hinzu:

\x00, \n, \r, \, ', " and \x1a. characters.

Wo addslashes nur Schrägstriche hinzufügt

' \ and NUL

Ilias Artikel ist auch ziemlich detailliert auf seine Funktionalität


Laut dem PHP-Handbuch :

mysql_real_escape_string () ruft die MySQL-Bibliotheksfunktion mysql_real_escape_string auf, die umgekehrte Schrägstriche den folgenden Zeichen voranstellt: \ x00, \ n, \ r, \, ', "und \ x1a.


Nach meinem Verständnis mysql_real_escape_string () die Arbeit genauer zu tun, wie es mit db kommunizieren, um zuerst zu überprüfen, was codiert werden muss und dann entsprechend codieren, nicht wahr? Also dort für die Arbeit effizienter

Warum willst du zuerst addslashes machen und dann wirst du diese Schrägstriche entfernen, bevor du die Daten zeigst und addslashes ist nicht so effizient wie mysql_real_escape_string, benutze mysql_real_escape_string, wenn du mysql_query wie db-Funktionen zum Abfragen verwendest, oder ich denke, PDO mit prepared ist der bessere Weg , da mysql_real_escape_string db-spezifisch ist


mysql_real_escape_string macht viel mehr als addslashes .

addslashes operiert auf reinen ascii, ohne etwas über die Datenbank zu wissen. Es entkommt:

  • '\'
  • "\"
  • \\\
  • ASCII 0\0 .

Der Zweck von mysql_real_escape_string besteht darin, "eine legale SQL-Zeichenfolge zu erstellen, die Sie in einer SQL-Anweisung verwenden können." mysql_real_escape_string berücksichtigt den aktuellen Zeichensatz der Verbindung (weshalb Sie immer ein gültiges $ mysql-Objekt übergeben müssen).

Es führt folgendes aus (aus der MySQL C API Dokumentation):

  • Codiert: \ , ' , " , ASCII 0 , \n , \r und Control+Z in einer Weise, die keine Probleme verursacht
  • stellt sicher, dass ein 0 Byte die Zeichenfolge beendet (in der C api)
  • kann eine Konvertierung von Multibyte (ascii) in Wide-Zeichen ausführen, wenn die mit $ mysql verknüpfte DB einen breiten Zeichensatz verwendet.

Ich weiß nicht wirklich, wie PHP Strings intern speichert, aber der Punkt ist all dies für PHP verfügbar, wenn Sie mysql_real_escape_string . Ich denke, der Hauptunterschied liegt darin, dass mysql_real_escape_string den Zeichensatz der Verbindung berücksichtigt , wobei addslashes nicht kann (er weiß nicht einmal, mit welcher DB er verbunden ist).


somedb_real_escape_string() ist datenbankspezifisch, addslashes() nicht.

Im Fall von MySQL bedeutet das:

mysql_real_escape_string () ruft die MySQL-Bibliotheksfunktion mysql_real_escape_string auf, die umgekehrte Schrägstriche den folgenden Zeichen voranstellt: \ x00, \ n, \ r, \, ', "und \ x1a.

(Aus dem Handbuch.)





sql-injection