2009-02-08 5 views
5

Verwenden Sie bei der Ausgabe von Benutzereingaben nur htmlspecialchars() oder gibt es Funktionen/Aktionen/Methoden, die Sie ebenfalls ausführen? Ich suche nach etwas, das sich auch mit XSS beschäftigen wird.Führen Sie htmlspecialchars() nur bei der Ausgabe aus oder gibt es andere Funktionen, die Sie auch ausführen?

Ich frage mich, ob ich eine Funktion schreiben sollte, die Benutzereingabe bei Ausgabe entkommt oder einfach htmlspecialchars() verwenden. Ich suche die generischen Fälle, nicht die spezifischen Fälle, die einzeln behandelt werden können.

Antwort

10

Normalerweise verwende ich

htmlspecialchars($var, ENT_QUOTES) 

auf Eingabefelder ein. Ich habe eine Methode entwickelt, die das tut, weil ich das oft benutze und dadurch den Code kürzer und lesbarer macht.

+1

Warum die Verwendung von 'ENT_QUOTES' (anstatt 'ENT_NOQUOTES' wie von mir vorgeschlagen)? –

+2

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. –

+1

Ólafur: Ja, auf Eingabefelder (oder allgemeiner Attribute) macht es einen gewissen Sinn ;-) –

7

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:

  1. Text in HTML: htmlspecialchars (...)

  2. Daten in HTML-Attribute htmlspecialchars (..., ENT_QUOTES)

  3. HTML in HTML Verwenden Sie eine Bibliothek wie HTMLPurifier, um sicherzustellen, dass nur gültige Tags vorhanden sind.

  4. Daten in Javascript Ich bevorzuge json_encode. Wenn Sie es in ein Attribut einfügen, müssen Sie immer noch # 2 verwenden, z. B.

  5. 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)."'"

  6. 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)

-5

Sie sollten Text bei der Ausgabe nicht bereinigen, es sollte am Eingang passieren. Ich benutze einen Filter, der alle Eingaben für die Anwendung filtert. Es ist konfigurierbar, um bestimmte Tags/Daten bei Bedarf durchzulassen (zB für einen WYSIWIG-Editor).

Sie sollten so wenig Text wie möglich verarbeiten, um die Geschwindigkeit zu gewährleisten. Wenn man es einmal bearbeitet, wird es viel weniger beansprucht, als es 500.000 mal zu verarbeiten.

+0

würde ich Ich stimme dir zu, außer dass die Theorie im Allgemeinen nur gültige Eingaben akzeptiert, aber dann musst du trotzdem der Ausgabe entkommen. Das Problem tritt auf, wenn jemand ein Zitat in seinen Benutzernamen eingibt, du entkommst mir t für HTML wird es für die PDF-Generierung unbrauchbar. –

+0

Heres die Sache jedoch, wenn Sie dies für das Web programmieren, wie oft wird es im Internet als PDF exportiert werden. Ich gehe davon aus, dass Sie bei jeder Ansicht keine PDF-Dateien generieren. Also mein Punkt steht fest, im Falle eines PHP-Exports kann man einfach die Ausgabe umkehren. – Syntax

+0

Nun, die Regel besteht immer noch darin, dass Sie die Benutzerdaten so genau wie möglich in der Datenbank speichern und bei Bedarf nach Bedarf ändern möchten. Ich arbeite auf einigen Websites, wo 50% von Web/HTML und 50% ist PDF/Excel/etc. –