PHP: \ "Zitate \". Compilation mysql query, Schrägstriche, zitiert Screening.


  • Schnell Empfehlungen.
  • Regeln für die Erstellung von MySQL - Abfragen
  • Dynamische Abfrage
  • Die korrekte Arbeit mit Sonderzeichen bei der Erstellung von Anfragen
  • Prepared Statements
  • SQL Injection
  • Arbeiten mit
  • Über Slash. Wie man sie los
  • Bemerkungen
  • Hinweis: Formulare
  • Kommentare
  • Schnell Empfehlungen.

  • sollten zwei einfache Regeln beachten SQL-Injection zu verhindern:
    1. Legen Sie die Daten nicht in der Datenbank ohne Behandlung.
    Dies kann manuell entweder durch vorbereitete Anweisungen oder Verarbeitungsparameter erfolgen.
    Wenn die Anforderung mit der Hand gehalten wird,
    - Alle numerischen Parameter sollten auf die gewünschte Art eingestellt werden,
    - Alle anderen Parameter sind verarbeitete Funktion mysql_real_escape_string werden () und in Anführungszeichen eingeschlossen.

    2. Legen Sie in einem Antrag nicht für Kontrollstrukturen und Kennungen, die von dem Benutzer eingegeben.
    Eine Vorregistrierung im Skript eine Liste von Optionen, und nur einer von ihnen wählen.

    Lesen Sie mehr darüber - warum sollten wir es tun und wie das alles funktioniert, können Sie weiter unten. Und es wird dringend empfohlen.

    Regeln für die Erstellung von MySQL - Abfragen
    Für einen Start - ein wenig darüber, warum brauchen wir diese Schrägstrichen.
    Wenn wir in der Abfrage alle Daten ersetzen dann die Daten von SQL-Befehlen zu unterscheiden, müssen sie zitiert werden.
    Zum Beispiel, wenn Sie schreiben,
    SELECT * FROM table WHERE name = Bill
    dann wird die Basis, dass Bill entscheiden - dies ist der Name eines anderen Feldes ist, wird es nicht finden, und wird einen Fehler erzeugen. Daher Inline-Daten (in diesem Fall der Name des Bill) müssen in Anführungszeichen gesetzt werden - dann findet seine Grundlinie, deren Wert es notwendig ist, einen Feldnamen zuweisen:
    SELECT * FROM table WHERE name = 'Bill'
    Jedoch selbst die Daten und kann auch Anführungszeichen auftreten. Z.B,
    SELECT * FROM table WHERE name = 'Д'Артаньян'
    Hier bestimmt die Datenbank, dass die "D" - die Daten und Artagnan ist - das Team, das weiß sie nicht, und auch einen Fehler geben wird. Daher ist es notwendig, Daten zu prosleshivat der Grundlage des in dieser Zitate (und einige andere Sonderzeichen) auf die Daten beziehen vorkommendes zu erklären.
    Das Ergebnis ist eine gültige Anforderung, die Fehler wird nicht dazu führen:
    SELECT * FROM table WHERE name = 'Д\'Артаньян'

    So haben wir festgestellt, dass die Daten in der Anforderung durch Substitution sollte zwei Regeln beachten:
    - Alle in die Abfragedaten eingefügt müssen in Anführungszeichen gesetzt werden (einfach oder doppelt, aber es ist bequemer und oft einmaligen Gebrauch mehr).
    - Alle String-Variablen sollten gescreent werden schlitzt Sonderzeichen.

    Es sollte besonders zu beachten: Hinzugefügt Schrägstriche gehen nicht in die Datenbank. Sie wollen nur abzufragen. Wenn in die Basis des Schrägstriche verworfen injiziert. Dementsprechend ist ein häufiger Fehler strip zu verwenden , wenn Daten aus der Datenbank abgerufen werden .

    In der Tat bezieht sich alle oben auf einen String-Typ Daten und Termine. Zahlen können eingefügt werden und nicht prosleshivaya okruzhaya Anführungszeichen. Wenn Sie dies tun, sollten Sie! bringen gewaltsam die Daten auf den richtigen Typ, bevor er in die Abfrage, zum Beispiel das Einfügen:
    $id = intval ( $id );
    Jedoch aus Gründen der Einfachheit (und Zuverlässigkeit) und kann mit Zahlen als Strings arbeiten (proskolku mysql sie noch auf den richtigen Typ umwandeln). Dementsprechend werden wir alle Daten in die Abfrage prosleshivat eingefügt und in Anführungszeichen eingeschlossen.

    Außerdem gibt es eine andere Regel - ist optional, aber es sollte gefolgt werden, um den Fehler zu vermeiden:
    Die Namen der Felder und Tabellen sind in den Rück einfache Anführungszeichen gesetzt werden - "` "Nachdem alle (die Taste mit dem Symbol auf einer Standardtastatur auf der linken Seite der Tasten" 1 "ist), der Feldname das gleiche wie das Schlüsselwort mysql, aber Sie, wenn wir Backticks verwenden, MySQL wird verstehen, alles in Ordnung:
    SELECT * FROM `table` WHERE `date` = '2006-04-04'
    Es ist notwendig, zwischen diesen Zitaten zu unterscheiden und nicht eine mit dem anderen verwechseln. Es sollte auch daran erinnert werden, dass die Backticks Schrägstriche nicht abgeschirmt sind.

    Dynamische Abfrage
    Wenn die SQL-Abfrage in einem Skript vollständig geschrieben, und ändert sich nicht, zum Beispiel,
    SELECT * FROM `table`
    dann wird kein Problem mit ihm nicht.
    Aber die Stärke unserer Skript ist eine dynamische Zeichnung Anfragen!
    Anstatt Anfragen für alle Gelegenheiten bereit zu schreiben, machen wir sie auf der Grundlage der vom Skript empfangenen Daten.
    Und jetzt sind wir in Gefahr.
    Lassen Sie uns sagen, dass wir eine Anfrage, mit der Variable:
    SELECT * FROM table WHERE name = '$name'
    Es scheint zu sein - alles in Ordnung?
    Und wenn $ name, werden wir D'Artagnan sein? Der Antrag wird ein Fehler generiert!
    Das heißt, die Variablensubstitution vor der Abfrage ist notwendig prosleshit.
    Dies kann auf verschiedene Arten erfolgen.
    Die einfachste (und falsch) - verlassen sich auf magische Zitate. Wie Sie vielleicht schon erraten haben, ist es in diesem Fall sind sie erfunden wurden. Um SQL-Abfragen vergesslich Programmierer Fehler zu schützen, werden alle eingehenden Daten in ein Skript prosleshivayutsya wahllos.
    Wenn Sie jemand anderem Code verwenden, dann ist es besser , Magie Zitate zu verwenden. Dies kann einige Unannehmlichkeiten verursachen und nicht garantieren, dass Sie von Fehlern oder Hacking (als prosleshivaniem Regeln der Zeichnung sind nicht auf Anfragen beschränkt), aber zumindest reduziert es das Risiko. Deshalb wird, wenn jemand anderes Code verwenden, stellen Sie sicher, dass Magic Quotes enthalten sind.
    Wenn Sie alle den Code selbst schreiben, sollten Sie die richtige Vorbereitung der Anträge lernen.

    Die korrekte Arbeit mit Sonderzeichen bei der Erstellung von Anfragen
    So. Wie wir oben gelernt haben, auf der rechten Seite einen Antrag zu machen, ist es notwendig, Daten in Anführungszeichen einzugeben und sie prosleshivat.
    Mit dem ersten ist alles klar. Bei der Erstellung der dynamischen Abfrage, werden wir nie alle in Anführungszeichen Daten vergessen:
    $query = "INSERT INTO `table` VALUES(NULL,'$name','$date','$price')" ;
    Wenn die Variable $ Preis vom Typ int sein muss, und wir geben es auf diese Art ist es möglich, sie nicht in Anführungszeichen eingeschlossen ist. Wenn wir jedoch feststellen, dass die besondere nicht die Mühe sein wird, aber Sie können den Job mit einem einheitlichen Daten tun.

    Die zweite - prosleshivanie - und ist die eine, für die in der Tat in den meisten Fällen, und dieser Text geschrieben. Wie ist es vor allem die Probleme und Schwierigkeiten.

    Bitte deaktivieren Magic Quotes. Somit kann, wie zu Beginn beschrieben wurde.
    Warum sollte es sein?
    Aus vielen Gründen. Die naheliegendste - die Logik. "Magic Quotes" hinzugefügt Schrägstriche, nicht dort , wo sie benötigt werden - bei der Vorbereitung des Antrags und bevor sie in das Skript eingeben! Aber die Daten nicht notwendigerweise dann in die Anfrage eingefügt werden. Vielleicht müssen sie für den Benutzer anzeigen, und nur mit Schrägstrichen stören. Außerdem hinzugefügt Schrägstriche zu verhindern, zum Beispiel richtig die Länge der eingegebenen Zeichenkette überprüfen. Außerdem müssen prosleshivat wir nicht nur aus den Benutzerdaten, aber im Allgemeinen, jeder in die Abfrage eingefügt - diese offensichtliche Tatsache , viele nicht einmal in den Sinn kommen! Die Liste geht weiter, aber einen Schluss zu: es ist nicht notwendig, schlitzt eine Pistole an, wahllos, vor der Ausführung des Skripts, aber nur dann, wenn wirklich notwendig - bei der Vorbereitung des Antrags.
    Es gibt einen weiteren Grund: wenn der Unicode-Codierung verwenden, die immer beliebter wird, und besetzen schließlich eine beherrschende Stellung auf dem Netz, Magic Quotes einfach den Text verderben können, ein Teil der Multibyte-String der Sonderzeichen nehmen.

    Jetzt zaymёmsya Hinzufügen Schrägstriche besitzen.
    Zunächst werden wir für prosleshivaniya Funktion mysql_real_escape_string()
    Beachten Sie, dass es nur nach der Verbindung mit der Datenbank verwendet werden kann.
    Diese Funktion macht es viel mehr als veraltet und addslashes mysql_escape_string. Erstens macht es einfacher, mysql Protokolle zu erhalten und zu lesen, zu ersetzen, zum Beispiel auf das Newline-Zeichen "\n" und einige andere Zeichen, die Escape-Sequenz. Zweitens, und was am wichtigsten ist - es funktioniert mit Multi-Byte-Codierung unter Berücksichtigung der aktuellen MySQL-charset und nicht verderben, so dass die Unicode-Text.
    Zweitens, vergessen Sie nicht, dass es notwendig ist, um alle Daten zu prosleshit, die wir in die Abfrage in Anführungszeichen eingegeben haben:

    $name
    = mysql_real_escape_string ( $name );
    $age = mysql_real_escape_string ( $age );
    $query = "INSERT INTO table (name,age,class) VALUES ('$name','$age',11)" ;

    oder:
    $query = "SELECT * FROM table WHERE name LIKE '" . mysql_real_escape_string ( $_GET [ 'name' ]). "%'" ;
    Man kann sehen, der Code recht umständlich ist. Zur Erleichterung kann die Herstellung von Anfragen an verschiedene uhischneniya gesendet werden - tun Funktion aus einer Datei abzufragen (sehr nützlich für INSERT und UPDATE-Abfrage-Typ) prosleshivat Array von Daten in einer Schleife, und so weiter.
    Sie können schreiben und Ihre Bibliothek oder eine Funktion für die Abfrage.
    Die Hauptsache - nicht vergessen, dass nur die strikte Einhaltung der Regeln der Anforderungen der Erstellung garantiert Ihnen, die Datenbank zu hacken, sowie zu erkennen, dass die Verwendung von "Magic Quotes", mit scheinbarer Leichtigkeit Abfrage-, nicht eine solche Garantie nicht geben, aber stört nur mit dem normalen Betrieb der Anwendung.

    Prepared Statements
    Es gibt eine andere Möglichkeit, die Datenbank abfragen, die so genannte "Prepared Statements" (Prepared Statements).
    Sein Wesen besteht darin, dass die vorbereitete Vorlage Wunsch mit speziellen Markern, der Ort, von denen die dynamischen Komponenten ersetzt werden. Ein Beispiel einer solchen Vorlage:
    SELECT * FROM table WHERE name=? Ein Fragezeichen hier - das ist die Markierung. In einer anderen Art und Weise wird es einen Platzhalter (Platzhalter) genannt. Das Geheimnis ist, dass die Daten in seinen Platz eingesetzt ist eine Besonderheit, dass "bindet", um die variable Nachfrage.
    Hier ist, wie der Code wie in diesem Fall aussieht:
    $stmt = $mysqli -> prepare ( "SELECT District FROM City WHERE Name=?" );
    $stmt -> bind_param ( "s" , $city );
    $stmt -> execute ();
    In der ersten Zeile bereiten wir die Abfragevorlage.
    In der zweiten - binden an den Marker Wert der Variablen $ city.
    Die dritte Zeile durchgeführt von ausgebildeten Antrag stellen.
    Und wobei die Anforderungsdaten sind nicht in der Datenbank zusammen und individuell, die Möglichkeit, Fehler oder böswillige Manipulation zu beseitigen.

    Es ist klar, dass es viele Fragen gibt. Aber weder das Volumen noch Gegenstand dieses Artikels erlauben nicht näher auf sie zu stoppen. Ich empfehle für die Bibliothek in der Dokumentation zu entnehmen mysqli und < PDO , der Anwendung dieses Grundsatzes.
    Außerdem können Sie DbSimple Dmitry Koterova oder PEAR :: DB-Bibliothek verwenden. Der wesentliche Unterschied zwischen diesen beiden ist, dass sie den Mechanismus der Ausdruck nur oberflächlich ausgebildeten implementieren. Innerhalb der Arbeit in der alten Art und Weise - die Anforderung und es an der Basis zu senden, über die Arbeit der Verarbeitungsvariablen nehmen. Ein PDO mysqli und betrieben, wie oben beschrieben - das heißt, die Abfrage Schablonendaten und separat in die Datenbank gehen.

    SQL Injection

    So haben wir gelernt, wie die Daten in der Anforderung zu belichten.
    ABER! Dynamische Abfrage von Daten auf die Substitution nicht auf diese beschränkt. Oft haben wir in einer SQL-Abfrage-Befehl und Feldnamen zu ersetzen. Und hier sind wir auf das Thema Sicherheit wenden:

    SQL Injection - ist ein Weg, ein Hacker-Angriff, wenn sie auf die Skriptdaten wird so modifiziert, dass der Antrag in diesem Skript erzeugt wird, ist auszuführen beginnt nicht etwas, für das sie vorgesehen ist.
    Regeln gegen solche Angriffe zu schützen, können in zwei Punkte unterteilt werden:
    1. Die Arbeit mit den Daten.
    2. Arbeiten Sie mit den Bedienelementen des Antrags.

    Der erste Punkt, den wir oben im Detail untersucht. Es kann gesagt werden, und ist nicht in der Tat, geschützt. Die Einhaltung der Regeln der neben der zugehörigen Anforderung diktiert, vor allem, die SQL-Syntax-Anforderungen. Und als Nebeneffekt haben wir und Schutz gegen Einbruch.

    Der zweite Punkt ist viel schwieriger, weil es keine einzige der gleichen universellen Regeln für Daten - Backquote nicht den Feldnamen aus der Modifikation eines Hacker zu schützen. Kann nicht zitiert schützen den Tabellennamen, die SQL-Anweisungen, die LIMIT Befehlsparameter und andere Betreiber.
    Daher steuert die Grundregel auf Substitution in dieser Abfrage:
    Wenn Sie dynamisch wollen in SQL - Anweisungen oder Abfragefeldnamen, Datenbanken, Tabellen zu ersetzen, dann unter keinen Umständen fügen Sie sie nicht direkt in die Abfrage.
    Alle Varianten solcher Ergänzungen müssen in Ihrem Skript und ausgewählt auf der Grundlage, dass der Benutzer eingegeben vorregistriert werden.
    Zum Beispiel, wenn Sie den Feldnamen in der Reihenfolge durch den Bediener, dann auf jeden Fall passieren müssen, ist es unmöglich, ihn direkt zu ersetzen. Wir müssen es zuerst überprüfen. Zum Beispiel kann ein Array von akzeptablen Werten zu machen und nur in einer Anforderung zu ersetzen, wenn der Parameter in dem Array übergeben:
    $orders =array( "name" , "price" , "qty" );
    $key = array_search ( $_GET [ 'sort' ], $orders ));
    $orderby = $orders [ $key ];
    $query = "SELECT * FROM `table` ORDER BY $orderby" ;
    Wir suchen nach einer Reihe von Optionen, die zuvor das Wort vom Benutzer eingegebenen beschrieben, und wenn wir es, wählen Sie das entsprechende Array-Element finden. Wenn keine Übereinstimmung gefunden wird, dann wird das erste Element des Arrays ausgewählt.
    Somit wird die Abfrage ersetzt nicht das, was der Benutzer eingegeben haben, und dem, was in unserem Skript geschrieben wurde.
    In ähnlicher Weise ist es notwendig, und in allen anderen Fällen zu tun
    Zum Beispiel erzeugt, wenn dynamisch WHERE-Klausel:
    if (!empty( $_GET [ 'price' ])) $where .= "price='" . mysql_real_escape_string ( $_GET [ 'price' ]). "'" ;
    $query = "SELECT * FROM `table` WHERE $where" ;
    Ich finde es schwierig, einen Fall vorstellen, wo der Tabellenname kann dynamisch in die Abfrage ersetzt werden, aber wenn das passiert, dann muss der Name auch im Skript vorgeschrieben nur von der voreingestellten eingefügt werden.
    LIMIT - Klausel Parameter sollten mit Gewalt in einen Integer - Typ umgewandelt werden , unter Verwendung von arithmetischen Operationen oder Funktionen intval ().
    Wir sollten nicht denken, dass die hier aufgeführten Beispiele alle Optionen für dynamische Abfragen erschöpfen. Sie müssen nur das Prinzip zu verstehen und es in allen solchen Fällen anzuwenden.

    Merkmale einer LIKE
    Es ist ein Sonderfall - der Operator LIKE.
    Erstens, abgesehen von der üblichen prosleshivaniya in Variablen, die in dergleichen substituiert werden, ist es notwendig, die Schrägstriche zu verdoppeln. Das heißt, wenn die Variable das Zeichen \ enthält, sollte es verdoppelt werden, und dann einen normalen prosleshivanie durch mysql_real_escape_string zuführen.
    Zum Beispiel, wenn wir uns für die Linie
    Zeichen \ "Backslash" genannt , und wir brauchen eine exakte Übereinstimmung, dann verwenden wir einfach mysql_real_escape_string und es stellt sich die Standard - Anfrage aus:
    SELECT * FROM test WHERE field = 'символ \\ называется \"backslash\"' Wenn wir die Zeichenfolge in das LIKE ersetzen wollen, ist es zunächst notwendig , die jeweils in zwei Schrägstrich zu ersetzen, und dann mysql_real_escape_string verwenden. Das Ergebnis ist ein
    SELECT * FROM Tabelle WHERE Feld LIKE ' % Symbol \\\\ \ "Backslash \"% genannt'
    Zweitens sollten wir die Aufmerksamkeit auf die Tatsache, dass keine der Funktionen bezahlen, die Schrägstriche hinzufügen, fügen Sie sie nicht auf die Suche Metazeichen "%" und "_", in der LIKE-Anweisung verwendet. Deshalb, wenn Sie diesen Operator verwenden, und will nicht die Zeichen _ und% werden als Masken verwendet, dann Schrägstriche manuell hinzufügen. Dies kann Team getan werden
    $ data = addcslashes ($ data, '% _'); Hinweis - dies nicht addslashes ist! hat ein "c" zusätzlichen Buchstaben im Namen der Funktion.

    So stellt sich heraus, dass die Variablen in der LIKE-Operator verwendet werden, müssen wir gesondert behandeln.
    ersten Schrägstrich ein oder zwei, über das zum Beispiel Code ersetzen:
    $ Var = str_replace ( '\\' , '\\\\', $ var); dann prosleshivaem (es kann auf die Abfrage mit allen anderen Daten gehen auf dem Niveau sein):
    $var = mysql_real_escape_string ( $var ); und dann, wenn wir wollen _% und entsprach genau zu uns selbst, zu tun
    $var = addCslashes ( $var , '_%' );
    Als Ergebnis, wenn wir uns zum Beispiel die folgende Zeile
    символ \ называется "backslash", а символ _ называется "underscore" , nach der die Anfrage verarbeitet, sollte es so aussehen:
    '%символ \\\\ называется \"backslash\", а символ \_ называется \"underscore\" Das heißt, der Schrägstrich, die ursprünglich in der Linie war - vervierfacht. Die restlichen Zeichen prosleshilis wie gewohnt. Plus - prosleshilsya den Unterstrich.

    Über Slash. Wie man sie los
    Slash oder Backslash aus dem Englischen zurück Slash - Backslash ( "\"), die aus unerklärlichen Gründen plötzlich selbst in Ihrem Variablen erscheint. Er fügte hinzu, einige Sonderzeichen, aber vor allem seine Ankündigung wegen der Zitate.
    Dies geschieht aufgrund der speziellen PHP-Konfiguration ist in der Regel auf der Standard-Host enthalten. Theoretisch können diese Einstellungen, um die Sicherheit von Skripten, rabotayuyuschih Datenbank zu verbessern. automatisch in der Praxis jedoch durch bekommen Schrägstriche oft Verwirrung und Unannehmlichkeiten Zugabe, sowohl auf der Datenbank und in seiner Abwesenheit.
    Im Folgenden werden wir diese beiden Fälle zu sehen.

    Für das automatische Schrägstriche hinzufügen erfüllen php.ini-Direktiven, die "Magic Quotes" kollektiv genannt werden:
    magic_quotes_gpc und magic_quotes_runtime Wenn zuerst aktiviert, dann PHP fügt automatisch Schrägstriche zu den Daten , die von dem Benutzer kam - von POST, GET - Anfragen und Cookies (sowie - zum Login und Passwort per HTTP Genehmigung erhalten haben ).
    Wenn die zweite, Schrägstriche auf die Daten dann zugegeben während der Ausführung des Skripts erhalten - beispielsweise aus einer Datei oder Datenbank.

    Wenn Sie ohne Datenbank arbeiten, oder die Arbeit mit der Datenbank korrekt (was unten geschrieben wird), die zusätzlichen Schrägstriche nur behindern Sie, und wir sollten sie loswerden. Es ist einfacher und richtiger die automatische Zugabe, in PHP-Einstellungen zu deaktivieren.
    Dies kann entweder dadurch erfolgen , dass die entsprechenden Richtlinien in der php.ini Einstellung, wenn Sie Zugang zu ihm haben, oder indem Sie ein Verzeichnis in der Website Konev Datei erstellen .htaccess und fügen Sie die Zeile
    php_flag magic_quotes_gpc 0
    php_flag magic_quotes_runtime 0

    Wenn Sie auf diese Weise deaktivieren nicht funktioniert, müssen Sie den Code schreiben unterschiedlicher Schwierigkeit, die eingehenden Daten aus den Schrägstriche zu löschen. (Wenn Sie jedoch eine portable Anwendung schreiben wollen, unabhängig von den PHP-Einstellungen, dann schreiben Sie es noch zu haben. Und mit einem separaten Gerät am Anfang Ihrer Skripte).

    Mit den Daten, die während der Operation erhalten, auf die einfachste Art und Weise herausfinden: nur am Anfang des Skripts schreiben
    set_magic_quotes_runtime(0); Für die Daten von dem Benutzer empfangen wird, ist es viel komplizierter. Dazu müssen wir den Code hat zwei Funktionen:
  • überprüfen , ob PHP hinzugefügt, können Sie die Funktion nutzen zu können get_magic_quotes_gpc .
  • Funktion entfernt Schrägstriche stripslashes .
    Dementsprechend ist es notwendig, durch die erste zu überprüfen und, wenn hinzugefügt, PHP, dann alle eingehenden Variablen aufzuzählen und von dieser gereinigt.
    Wenn Sie recht haben, wenn register_globals = off genügt es strip für alle Arrays anzuwenden , um die Daten enthalten , von einem Browser kommen.
    Zum Beispiel können Sie alle der Website Skripte diesen Code beinhalten:
    function strips (& $el ) {
    if (
    is_array ( $el ))
    foreach(
    $el as $k => $v )
    strips ( $el [ $k ]);
    else
    $el = stripslashes ( $el );
    }
    if (
    get_magic_quotes_gpc ()) {
    strips ( $_GET );
    strips ( $_POST );
    strips ( $_COOKIE );
    strips ( $_REQUEST );
    if (isset(
    $_SERVER [ 'PHP_AUTH_USER' ])) strips ( $_SERVER [ 'PHP_AUTH_USER' ]);
    if (isset(
    $_SERVER [ 'PHP_AUTH_PW' ])) strips ( $_SERVER [ 'PHP_AUTH_PW' ]);
    }
    Im Fall von falschen Einstellungen register_globals akzeptable Lösung insgesamt wäre schwer zu finden, so ist es am besten - wieder - nur mit den richtigen Einstellungen arbeiten.

    Bemerkungen
    • Zu den Gründen, warum Sie nicht auf den "Magic Quotes" verlassen sollte, gibt es eine weitere. Es ist sehr unwahrscheinlich, aber trotzdem. Mit "Magic Quotes" bezieht sich in der Tat nicht zwei Richtlinien und drei. Drittens - magic_quotes_sybase . Darüber hinaus fügt es ein Angebot, anstatt einen Schrägstrich - so sie überschreibt noch magic_quotes_gpc. Wenn durch ein Wunder, diese beiden Richtlinien den Status 'auf' haben, wird diese nicht funktionieren! Das heißt, auf "Magic Quotes" unter Berufung, in diesem Fall haben wir den Charme falsch formatierte Anfragen erhalten. Eigentlich theoretisch ist es notwendig, zu berücksichtigen, die Existenz der Richtlinie, da es mehr präsentiert und so eine Überraschung, da ... Änderung im Verhalten und Funktion addslashes strip! Wenn magic_quotes_sybase = on , beginnen diese Funktionen anstelle von Add zu zerschneiden oder ein einfaches Anführungszeichen zu entfernen sind.
    • Все приведенные примеры касаются только БД Mysql. Конкретные правила составления запросов могут отличаться для других СУБД, но общий принцип остается прежним:
      • если API для работы с БД или сторонняя библиотека предоставляет специальные функции для составления запросов , и есть возможность их использования, то пользоваться в первую очередь надо ими.
      • если таких функций нет, то следует искать в документации функции экранирования спецсимволов для этой СУБД.

    Примечание: формы
    При выводе value в тегах input форм, слеши не помогают.
    Чтобы текст в таком поле выводился целиком, value надо заключать в кавычки , а к выводимым данным применять функцию htmlspecialchars()
    Beispiel:
    <input type="text" name="name" value=" <? echo htmlspecialchars ( $name , ENT_QUOTES ) ?> "> <textarea> <? echo htmlspecialchars ( $text , ENT_QUOTES ) ?> </textarea>
    Необходимо так же отметить (хоть это уже совсем не имеет отношения к кавычкам и слешам), что функцию htmlspecialchars следует применять при выводе в браузер вообще ко всем данным, которые получены от непроверенного пользователя. Почему это следует делать, можно почитать в гугле по запросу что такое XSS уязвимость
    by phpfaq.ru