Lets haben einen kurzen Überblick über WARUM Entkommen in verschiedenen Kontexten gebraucht wird:
Wenn Sie in einem Zitat getrennte Zeichenfolge sind, müssen Sie die Anführungszeichen entkommen zu können. Wenn Sie in XML sind, dann müssen Sie "Inhalt" von "Markup" trennen Wenn Sie in SQL sind, müssen Sie "Befehle" von "Daten" trennen Wenn Sie in der Befehlszeile sind, müssen Sie trennen "Befehle" von "Daten"
Dies ist ein wirklich grundlegender Aspekt der Computer im Allgemeinen. Da die Syntax, die Daten abgrenzt, in den Daten auftreten kann, muss es eine Möglichkeit geben, die Daten vom SYNTAX zu unterscheiden und somit zu entkommen.
In Web-Programmierung, die gemeinsame Flucht Fälle sind: 1. Ausgabe von Text in HTML 2. Ausgabe von Daten in HTML-Attribute 3. Ausgabe von HTML-Code in HTML 4. Einfügen von Daten in Javascript 5. Einfügen von Daten in SQL 6. Einfügen von Daten in einen Shell-Befehl
Jeder hat eine andere Sicherheit Auswirkungen bei falscher Behandlung. Das ist wirklich wichtig! Lassen Sie uns diese Bewertung im Rahmen von PHP:
Text in HTML: htmlspecialchars (...)
Daten in HTML-Attribute htmlspecialchars (..., ENT_QUOTES)
HTML in HTML Verwenden Sie eine Bibliothek wie HTMLPurifier, um sicherzustellen, dass nur gültige Tags vorhanden sind.
Daten in Javascript Ich bevorzuge json_encode
. Wenn Sie es in ein Attribut einfügen, müssen Sie immer noch # 2 verwenden, z. B.
Einfügen von Daten in SQL Jeder Treiber verfügt über eine Escape() - Funktion einer Art. Es ist das beste. Wenn Sie in einem normalen Latin1-Zeichensatz arbeiten, ist addslashes (...) geeignet. Vergessen Sie nicht die Anführungszeichen RUND um den Aufruf addslashes():
"INSERT INTO table1 SET field1 = '". addslashes ($ Daten)."'"
Daten auf der Kommandozeile escapeshellarg() und escapeshellcmd() - lesen Sie das Handbuch
- diese zu Herzen nehmen, und Sie werden 95% * der gemeinsamen beseitigen Internetsicherheitsrisiken! (* a guess)
Warum die Verwendung von 'ENT_QUOTES' (anstatt 'ENT_NOQUOTES' wie von mir vorgeschlagen)? –
Ich verwende ENT_QUOTES für Eingabefelder mit Daten aus der Datenbank. Wenn also die Daten 'oder' haben, wird die Wertvariable nicht innerhalb des Eingabe-Tags geschlossen. –
Ólafur: Ja, auf Eingabefelder (oder allgemeiner Attribute) macht es einen gewissen Sinn ;-) –