Frage

Ich habe Probleme zu entkommen / Strings mit PHP / MySQL Strippen -. Es scheint immer redundante Schrägstriche zu sein


Lassen Sie uns nehmen Sie die folgende Zeichenfolge als Beispiel:

<span style="text-decoration:underline;">underline</span>


Wenn eine Zeichenfolge in der Datenbank hinzufügen, ich bin es mit mysql_real_escape_string() zu entkommen und die folgenden wird in der Datenbank ( Bearbeiten : markiert diese durch die Datenbank direkt mit MySQL-App abfragen): gespeichert

<span style=\\\"text-decoration:underline;\\\">underline</span>


Wenn wieder aus der Datenbank zu lesen, ich bin die Schnur durch stripslashes() vorbei und die folgende zurückgegeben:

<span style=\"text-decoration:underline;\">underline</span>


Da die Zitate noch entkommen sind, bricht es die HTML und der Text unterstrichen wird nicht.


  1. Warum ist das Hinzufügen mysql_real_escape_string() drei Schrägstriche und stripslashes() Entfernen von zwei Schrägstrichen? Ich würde erwarten, dass sie beide zu einem Schrägstrich hinzufügen / entfernen.
  2. Wie kann ich das verhindern?
  3. Bin ich dies die richtige Art und Weise nähern?
War es hilfreich?

Lösung

beste Lösung

In der php.ini-Datei, stehen die Chancen, dass die magic_quotes_gpc Richtlinie festgelegt ist auf. Dies sollte aus Sicherheitsgründen deaktiviert werden. Wenn Sie keinen Zugriff auf die Datei php.ini (zB. Auf einem gemeinsamen Host), kann man immer erreicht das gleiche eine .htaccess-Direktive (vorausgesetzt, dies ist ein Apache-Server).

In der php.ini

magic_quotes_gpc Off

In einer .htaccess-Datei:

php_flag magic_quotes_gpc Off

Warum ist das passiert?

Der Grund, warum dies geschieht, ist aufgrund der folgenden Verlauf der Logik.

  1. Eine Zeichenfolge, die Bedürfnisse von Umschreibungen an den Server gesendet wird.
    • This is my string. It's awesome.
  2. Magic Quotes entkommt den Apostroph, bevor es zu einem Code bekommt.
    • This is my string. It\'s awesome
  3. mysql_real_escape_string hat nun zwei Zeichen zu entkommen, den Backslash \\ sowie den Apostroph \'.
    • This is my string. It\\\'s awesome
  4. Diese neuen Super-Escape-Sequenzen in der Datenbank gespeichert ist.
  5. Wenn die Zeichenfolge aus der Datenbank abgerufen werden, es zu bekommen ist zu stripslashes weitergegeben. Dies entfernt die beiden in Stufe entweicht 3, aber da einer der Schrägstriche stripslashes denkt entgangen wurde es hingehört.
    • This is my string. It\'s awesome

Dieses Problem kann wirklich von Hand bekommen, wenn Sie diese Zeichenfolge in die Datenbank erneut vorlegen, da jedes Mal die Anzahl der Schrägstriche vervielfachen.

Alternative Lösung

Eine schnelle und einfache Alternative wäre, einfach die Schrägstriche durch magic_quotes hinzugefügt zu entfernen, bevor die Zeichenfolge mysql_real_escape_string vorbei.

$str = stripslashes($_POST['str']);
$str = mysql_real_escape_string($str);

Andere Tipps

  

Wenn eine Zeichenfolge in der Datenbank hinzufügen, ich bin es mit mysql_real_escape_string() zu entkommen und die folgenden wird in der Datenbank gespeichert sind:

     

<span style=\\\"text-decoration:underline;\\\">underline</span>

Nein, es ist nicht. Wenn Sie Zeichenfolge in einer SQL-Abfrage entkommen, ist es nur die Daten in der Abfrage zu transportieren. Die Datenbank analysiert die Abfrage und speichert die Daten in der Datenbank, ohne zusätzliche Schrägstriche. Wenn Sie also zum Abrufen von Daten aus der Datenbank, sollten Sie nicht unescape nichts. Es ist ein verbreiteter Irrtum.

Wenn Sie feststellen, dass es überschüssige Schrägstriche in der Ausgabe, haben Sie wahrscheinlich magic quotes eingeschaltet. Schalten Sie sie aus .

Edit:

mysql> create table foo (bar text) ;
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO foo (bar) VALUES ("<span style=\\\"text-decoration:underline;\\\">underline</span>");
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM foo;
+-------------------------------------------------------------+
| bar                                                         |
+-------------------------------------------------------------+
| <span style=\"text-decoration:underline;\">underline</span> | 
+-------------------------------------------------------------+
1 row in set (0.00 sec)

Wie Sie sehen können, hat die Abfrage eine weitere Ebene zu entkommen, als die Daten erscheinen in der Datenbank und damit, wie es kommt heraus, wenn es abgefragt wird. In Ihrem Fall, was ist wahrscheinlich geht, ist, dass Sie Sie haben magische Anführungszeichen eingeschaltet und dann Saiten zu entkommen, bevor sie in einer Abfrage einbetten. Dies führt zu einer doppelt zu entkommen, Ihre Daten Manipulation. Die richtige Lösung ist entkommen Strings zu halten, wie Sie tun, aber magic quotes auszuschalten. Und nicht alles tun, auf die Daten, wie sie von der Datenbank herauskommt. Hüten Sie sich vor, dass die Daten bereits in den Systemanforderungen zuerst gereinigt werden.

Wenn get_magic_quotes_gpc() in SERVER ausgeschaltet ist, so können wir nur nutzen

$data= mysql_real_escape_string($_POST['data']);

Wenn get_magic_quotes_gpc() auf in SERVER ist, wir verwenden müssen

$data= mysql_real_escape_string(stripslashes($_POST['data']));

fügen Sie sonst zwei Schrägstriche mit Ihren Daten.

Auch ist eine andere Lösung, die wir stripslashes($data) verwenden können, während von datadase zu holen, wenn wir nur mysql_real_escape_string($_POST['data']);

verwenden verwenden
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top