Frage

Ich mag XSS-Angriffe in meiner Web-Anwendung zu verhindern. Ich fand, dass HTML die Ausgabecodierung kann wirklich XSS-Angriffe verhindern. Das Problem ist jetzt, dass wie HTML ich jede einzelne Ausgabe in meiner Anwendung kodieren? Ich es eine Möglichkeit, dies zu automatisieren?

Ich schätze Antworten für JSP, ASP.net und PHP.

War es hilfreich?

Lösung

Sie wollen nicht alle HTML codieren, dass Sie nur wollen alle Benutzereingaben in HTML-kodieren, die Sie ausgeben.

Für PHP: htmlentities und htmlspecialchars

Andere Tipps

Eine Sache, die Sie sollte nicht zu tun ist, um die Eingangsdaten filtern, wie es kommt. Die Leute dies oft vorschlagen, da es die einfachste Lösung, aber es führt zu Problemen.

Die Eingabedaten können an mehreren Stellen gesendet werden, außer Ausgabe als HTML zu sein. Es könnte in einer Datenbank gespeichert werden, zum Beispiel. Die Regeln für die Datenfilterung zu einer Datenbank gesendet sind sehr verschieden von den Regeln zum Filtern von HTML-Ausgabe. Wenn Sie alles über Eingabe HTML-kodieren, werden Sie sich mit HTML in Ihrer Datenbank beenden. (Dies ist auch, warum PHP „magic quotes“ -Funktion ist eine schlechte Idee.)

Sie können nicht alle Orte antizipieren Ihre Eingangsdaten reisen. Der sichere Ansatz ist es, die Daten kurz vor dem vorzubereiten es irgendwo gesendet wird. Wenn Sie es an eine Datenbank senden, entkommen die einfachen Anführungszeichen. Wenn Sie HTML sind ausgegeben wird, entweichen die HTML-Entitäten. Und sobald es irgendwo gesendet, wenn Sie immer noch mit den Daten arbeiten müssen, verwenden Sie die Original-un-escaped Version.

Das ist mehr Arbeit, aber Sie können es reduzieren durch Template-Engines oder Bibliotheken.

Für JSPs können Sie Ihren Kuchen haben und ihn auch essen, mit dem c: out-Tag, die von Standard-XML-entkommt. Dies bedeutet, dass Sie auf Ihre Eigenschaften als Grundelemente binden können:

<input name="someName.someProperty" value="<c:out value='${someName.someProperty}' />" />

Wenn Sie auf eine Zeichenfolge gebunden, someName.someProperty wird die XML-Eingabe enthält, aber wenn Sie auf der Seite, wird es entkam automatisch bereitzustellen, um die XML-Entitäten ausgegeben wird. Dies ist besonders nützlich für die Links-Seite Validierung.

Eine schöne Art, wie ich zu entkommen verwendet, um alle Benutzereingaben durch das Schreiben eines Modifikator für Smarty wich ist entkommt alle Variablen auf die Vorlage übergeben; außer für diejenigen, die haben | unescape attached to it. Auf diese Weise können nur HTML-Zugriff auf die Elemente geben Sie explizit den Zugriff geben.

Ich habe nicht diesen Modifikator mehr; sondern um die gleiche Version finden Sie hier:

http: // www.madcat.nl/martijn/archives/16-Using-smarty-to-prevent-HTML-injection..html

In der neuen Version von Django 1.0 funktioniert dies genau die gleiche Art und Weise, jay:)

Meine persönliche Präferenz ist fleißig zu kodieren alles das kommt aus der Datenbank, Business-Schicht oder vom Benutzer.

In ASP.Net dies durch die Verwendung Server.HtmlEncode(string) gemacht wird.

Der Grund, so etwas zu kodieren ist, dass auch Eigenschaften, die Sie boolean sein könnte annehmen, oder numerische bösartigem Code (zB Kontrollkästchen Werte enthalten können, wenn sie nicht ordnungsgemäß könnte getan als Strings zurückkommen. Wenn Sie nicht kodieren sie, bevor die Ausgabe an den Benutzer zu senden, dann haben Sie eine Schwachstelle vor).

Sie könnten echo / print usw. in Ihren eigenen Methoden wickeln, die Sie dann Ausgang entkommen können. das heißt anstelle von

echo "blah";

Verwendung

myecho('blah');

Sie könnte sogar eine zweite param haben, die Flucht schaltet sich aus, wenn Sie es brauchen.

In einem Projekt hatten wir einen Debug-Modus in unseren Ausgabefunktionen, die alle die Ausgabe von Text unsichtbar durch unsere Methode geht gemacht. Dann wussten wir, dass auf dem Bildschirm etwas übrig hatte nicht entgangen ist! War sehr nützlich, diese frechen unescaped Bits aufzuspüren:)

If you do actually HTML encode every single output, the user will see plain text of &lt;html&gt; instead of a functioning web app.

EDIT: If you HTML encode every single input, you'll have problem accepting external password containing < etc..

The only way to truly protect yourself against this sort of attack is to rigorously filter all of the input that you accept, specifically (although not exclusively) from the public areas of your application. I would recommend that you take a look at Daniel Morris's PHP Filtering Class (a complete solution) and also the Zend_Filter package (a collection of classes you can use to build your own filter).

PHP is my language of choice when it comes to web development, so apologies for the bias in my answer.

Kieran.

OWASP has a nice API to encode HTML output, either to use as HTML text (e.g. paragraph or <textarea> content) or as an attribute's value (e.g. for <input> tags after rejecting a form):

encodeForHTML($input) // Encode data for use in HTML using HTML entity encoding
encodeForHTMLAttribute($input) // Encode data for use in HTML attributes.

The project (the PHP version) is hosted under http://code.google.com/p/owasp-esapi-php/ and is also available for some other languages, e.g. .NET.

Remember that you should encode everything (not only user input), and as late as possible (not when storing in DB but when outputting the HTTP response).

Output encoding is by far the best defense. Validating input is great for many reasons, but not 100% defense. If a database becomes infected with XSS via attack (i.e. ASPROX), mistake, or maliciousness input validation does nothing. Output encoding will still work.

there was a good essay from Joel on software (making wrong code look wrong I think, I'm on my phone otherwise I'd have a URL for you) that covered the correct use of Hungarian notation. The short version would be something like:

Var dsFirstName, uhsFirstName : String;

Begin

uhsFirstName := request.queryfields.value['firstname'];

dsFirstName := dsHtmlToDB(uhsFirstName);

Basically prefix your variables with something like "us" for unsafe string, "ds" for database safe, "hs" for HTML safe. You only want to encode and decode where you actually need it, not everything. But by using they prefixes that infer a useful meaning looking at your code you'll see real quick if something isn't right. And you're going to need different encode/decode functions anyways.

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