2016-03-29 11 views
3

Ich habe ein Problem, in dem ich versuche, den Antraginhalt zu säubern, um HTML und Javascript herauszustreifen, wenn sie in den Eingangsparametern enthalten werden.heraus filtern codierten Javascript-Inhalt von Antrag

Dies ist grundsätzlich zum Schutz vor XSS-Angriffen und der ideale Mechanismus wäre, Eingabe zu validieren und die Ausgabe zu kodieren, aber aufgrund einiger Einschränkungen kann ich nicht am Ausgabeende arbeiten.

Alles, was ich zu diesem Zeitpunkt tun kann, ist zu versuchen, den Eingang durch einen Filter zu reinigen. Ich verwende ESAPI, um die Eingabeparameter zu kanonisieren und jsoup mit der restriktivsten Option Whitelist.none() zu verwenden, um den gesamten HTML-Code zu entfernen.

Das funktioniert so lange, wie die bösartigen Javascript in einigen HTML-Tags sind aber nicht für eine URL mit JavaScript-Code ohne HTML umgebenden, zum Beispiel:

http://example.com/index.html?a=40&b=10&c='-prompt``-' 

landet auf der Seite eine Meldung zeigt. Dies ist eine Art, was ich jetzt tue:

param = encoder.canonicalize(param, false, false); 
param = Jsoup.clean(param, Whitelist.none()); 

Die Frage ist also:

  • eine Möglichkeit, durch die Gibt es ich sicherstellen kann, dass meine Eingabe aller HTML und JavaScript-Code gestrippt am Filter?
  • Sollte ich einige Regex-Validierungen einwerfen, aber gibt es einen Regex, der sich um die Fälle kümmern wird, die die Prüfung, die ich gerade habe, hinter mir haben?

Antwort

2

HAFTUNGSAUSSCHLUSS:

Wenn output-escaping nicht in Ihrer Internet-gerichteten Lösung erlaubt ist, Sie sind in einem NO-Win-Szenario. Es ist wie ein Antivirenprogramm unter Windows: Sie können spezifische und bekannte Angriffe erkennen, aber Sie können unbekannte Angriffe nicht erkennen oder abwehren. Wenn Ihr Arbeitgeber auf diesem Weg besteht, besteht Ihre Sorgfaltspflicht darin, das Management auf diese Tatsache aufmerksam zu machen und deren Akzeptanz der Risiken schriftlich zu bestätigen. Jedes Mal, wenn ich das Management damit konfrontiert habe, haben sie sich für die richtige Lösung entschieden - Ausgabe entweichen.

============================================== ==================

First off ... watch out when using JSoup in any kind of a cleaning/filtering/input validation situation.

Nach dem Empfang ungültig HTML, wie

<script>alert(1);

Jsoup wird hinzufügen im fehlenden </script> Tag.

Das bedeutet, wenn Sie Jsoup verwenden, um HTML zu "bereinigen", wandelt es zuerst INVALID HTML in VALID HTML um, bevor es mit der Verarbeitung beginnt.

Die Frage ist also: Gibt es eine Möglichkeit, durch die ich sicher machen kann, dass meine Eingabe aller HTML- und JavaScript-Code am Filter abgezogen wird?Sollte ich einige Regex-Validierungen einwerfen, aber gibt es eine Regex, die sich um die Fälle kümmert, die über die Prüfung Ich habe gerade jetzt?

Nr ESAPI und ESAPI der Eingabevalidierung ist für Ihren Anwendungsfall nicht geeignet, da HTML is not a regular language und Eingabe des ESAPI für seine Validierung sind Reguläre Ausdrücke. Die Tatsache ist, dass Sie nicht tun, was Sie fragen:

Gibt es eine Möglichkeit, durch die ich sicherstellen kann, dass mein Eingang aller HTML gestrippt und Javascript-Code auf dem Filter?

Und immer noch eine funktionierende Web-Anwendung, die benutzerdefinierte HTML/JavaScript benötigt.

Sie können das Deck zu Ihren Gunsten ein wenig stapeln: Ich würde etwas wie OWASP's HTML Sanitizer. wählen und Ihre Implementierung gegen die aufgelisteten XSS-Eingänge here testen.

Viele dieser Eingaben stammen aus OWASPs XSS-Filter-Umgehungs-Spickzettel und werden zumindest Ihre Anwendung gegen bekannte Versuche auswerten. Aber Sie werden niemals sicher sein, ohne zu entkommen.

=================== UPDATE VON KOMMENTAR ==================

SO die Use Case ist zu versuchen und blockieren alle HTML und Javascript. Meine Empfehlung ist caja zu implementieren, da es HTML, CSS und Javascript kapselt.

Javascript ist jedoch auch schwierig von der Eingabeüberprüfung zu verwalten, denn wie HTML ist JavaScript eine nicht-reguläre Sprache. Darüber hinaus verfügt jeder Browser über eine eigene Implementierung, die von der ECMAScript-Spezifikation abweicht. Wenn Sie Ihre Eingabe vor einer Interpretation schützen möchten, bedeutet das, dass Sie idealerweise für jede Browserfamilie einen Parser haben müssen, der versucht, Benutzereingaben zu interpretieren, um sie zu blockieren.

Wenn alles, was Sie wirklich tun müssen, ist sicherzustellen, dass die Ausgabe maskiert ist. Es tut mir leid, ein totes Pferd zu besiegen, aber ich muss betonen, dass das Austreten von Ausgaben 100 Mal wichtiger ist als die Ablehnung von Benutzereingaben. Sie möchten beides, aber wenn Sie gezwungen sind, das eine oder das andere zu wählen, ist das Ausbrechen von Ausgaben insgesamt weniger Arbeit.

+0

Danke für die Antwort. Ich verstehe was sie meinen. Über dies "Und immer noch eine funktionierende Web-Anwendung, die benutzerdefinierte HTML/JavaScript benötigt." Was ist, wenn ich nicht zulassen möchte, dass die Benutzer HTML/JS als Anfrage-Eingabeparameter übergeben? Gibt es einen Weg, das zu verhindern? Ich werde den HTML Sanitizer durchgehen, den Sie mit – Ash

+0

verbunden haben Beginnen Sie hier: https://github.com/OWASP/java-html-sanitizer/blob/master/docs/getting_started.md Grundsätzlich, was es wie Sie klingt, wie Sie wollen Um einen Richtlinien-Builder zu definieren, der im Wesentlichen leer ist ... werden keine HTML-Tags in der Anwendung erlaubt. Das heißt, nur alles HTML zu leugnen wird nicht XSS stoppen, die HTML-Attribute angreift ... wenn IE Sie gegen VBScript und Javascript schützen müssen. – avgvstvs

+0

Ich weiß nicht, ob Sie mit dem HTML Sanitizer Attributrichtlinien definieren können, wenn Sie bereits alle HTML-Eingaben ablehnen. – avgvstvs

Verwandte Themen