Frage

Jeff tatsächlich geschrieben über das in Sanitize HTML.Aber sein Beispiel ist in C# und ich bin wirklich mehr daran interessiert, eine Java-version.Hat jemand eine bessere version für Java?Ist sein Beispiel gut genug, um einfach zu konvertieren, die direkt von C# zu Java?

[Update] ich habe ein Kopfgeld auf diese Frage, denn SO war nicht so beliebt, wenn ich die Frage gestellt, wie es heute ist (*).Wie für alles zu den Themen Sicherheit, mehr Menschen kümmern, desto besser ist es!

(*) In der Tat, ich glaube, es war noch in der closed beta

War es hilfreich?

Lösung

Tun Sie dies nicht mit regulären Ausdrücken.Denken Sie daran, Sie sind nicht der Schutz nur gegen gültige HTML;Sie schützen vor den DOM, die web-Browser erstellen.Browser können so ausgetrickst werden, dass die Herstellung gültige DOM von ungültigen HTML-Codes ganz leicht.

Zum Beispiel finden Sie in dieser Liste von verschleierte XSS-Angriffe.Sind Sie bereit, eine maßgeschneiderte regex, um dies zu verhindern realen Welt attack on Yahoo und Hotmail auf IE6/7/8?

<HTML><BODY>
<?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time">
<?import namespace="t" implementation="#default#time2">
<t:set attributeName="innerHTML" to="XSS&lt;SCRIPT DEFER&gt;alert(&quot;XSS&quot;)&lt;/SCRIPT&gt;">
</BODY></HTML>

Wie wäre es mit diesem Angriff, der funktioniert auf IE6?

<TABLE BACKGROUND="javascript:alert('XSS')">

Wie über die Attacken, die nicht aufgeführt sind auf dieser Website?Das problem mit Jeff ' s Ansatz ist, dass es ist nicht eine Positivliste (whitelist), wie behauptet.Als jemand, der auf Seite versiert Hinweise:

Das problem dabei ist, dass die html - muss sauber sein.Es gibt Fälle, in denen Sie übergeben können, gehackt html, und es nicht entsprechen, in welchem Fall es werde Rückkehr der gehackt html-string als es nicht mit etwas zu ersetzen.Diese ist nicht unbedingt whitelisting.

Ich würde vorschlagen, Sie einen Zweck gebaut-tool wie AntiSamy.Es funktioniert, indem tatsächlich das Parsen der HTML-und dann das Durchlaufen des DOM und entfernen alles, was nicht in die konfigurierbar whitelist.Der wesentliche Unterschied ist die Fähigkeit, ordnungsgemäß zu behandeln die fehlerhafte HTML.

Der beste Teil ist, dass es eigentlich unit tests für alle XSS-Angriffe, die auf der oben genannten Website.Außerdem, was könnte einfacher sein als mit diesem API-Aufruf:

public String toSafeHtml(String html) throws ScanException, PolicyException {

    Policy policy = Policy.getInstance(POLICY_FILE);
    AntiSamy antiSamy = new AntiSamy();
    CleanResults cleanResults = antiSamy.scan(html, policy);
    return cleanResults.getCleanHTML().trim();
}

Andere Tipps

Ich bin nicht davon überzeugt, dass mit einem regulären Ausdruck ist der beste Weg, um alle verdächtigen code.Reguläre Ausdrücke sind sehr einfach zu betrügen, besonders beim Umgang mit zerbrochenen HTML.Für Beispiel, die reguläre Ausdrücke aufgeführt, die in der Sanitize HTML-link werden nicht entfernen Sie alle " a " - Elemente, die ein Attribut zwischen dem element-name und das Attribut 'href':

< a alt="xss-injection" href="http://www.malicous.com/bad.php" >

Eine weitere zuverlässige Art und Weise des Entfernens der schädliche code und setzen auf einen XML-Parser, dass kann Griff alle Arten von HTML-Dokumenten (Aufgeräumt, TagSoup, etc) und die Elemente auswählen, entfernen Sie mit einem XPath-Ausdruck.Sobald das HTML-Dokument geparst wird in einem DOM-Dokument die Elemente zu revome können gefunden werden leicht und sicher.Dies ist auch einfach zu tun mit XSLT.

Ich extrahiert aus NoScript beste Anti-XSS-addon, hier ist der Regex:Arbeit makellos:

<[^\w<>]*(?:[^<>"'\s]*:)?[^\w<>]*(?:\W*s\W*c\W*r\W*i\W*p\W*t|\W*f\W*o\W*r\W*m|\W*s\W*t\W*y\W*l\W*e|\W*s\W*v\W*g|\W*m\W*a\W*r\W*q\W*u\W*e\W*e|(?:\W*l\W*i\W*n\W*k|\W*o\W*b\W*j\W*e\W*c\W*t|\W*e\W*m\W*b\W*e\W*d|\W*a\W*p\W*p\W*l\W*e\W*t|\W*p\W*a\W*r\W*a\W*m|\W*i?\W*f\W*r\W*a\W*m\W*e|\W*b\W*a\W*s\W*e|\W*b\W*o\W*d\W*y|\W*m\W*e\W*t\W*a|\W*i\W*m\W*a?\W*g\W*e?|\W*v\W*i\W*d\W*e\W*o|\W*a\W*u\W*d\W*i\W*o|\W*b\W*i\W*n\W*d\W*i\W*n\W*g\W*s|\W*s\W*e\W*t|\W*i\W*s\W*i\W*n\W*d\W*e\W*x|\W*a\W*n\W*i\W*m\W*a\W*t\W*e)[^>\w])|(?:<\w[\s\S]*[\s\0\/]|['"])(?:formaction|style|background|src|lowsrc|ping|on(?:d(?:e(?:vice(?:(?:orienta|mo)tion|proximity|found|light)|livery(?:success|error)|activate)|r(?:ag(?:e(?:n(?:ter|d)|xit)|(?:gestur|leav)e|start|drop|over)?|op)|i(?:s(?:c(?:hargingtimechange|onnect(?:ing|ed))|abled)|aling)|ata(?:setc(?:omplete|hanged)|(?:availabl|chang)e|error)|urationchange|ownloading|blclick)|Moz(?:M(?:agnifyGesture(?:Update|Start)?|ouse(?:PixelScroll|Hittest))|S(?:wipeGesture(?:Update|Start|End)?|crolledAreaChanged)|(?:(?:Press)?TapGestur|BeforeResiz)e|EdgeUI(?:C(?:omplet|ancel)|Start)ed|RotateGesture(?:Update|Start)?|A(?:udioAvailable|fterPaint))|c(?:o(?:m(?:p(?:osition(?:update|start|end)|lete)|mand(?:update)?)|n(?:t(?:rolselect|extmenu)|nect(?:ing|ed))|py)|a(?:(?:llschang|ch)ed|nplay(?:through)?|rdstatechange)|h(?:(?:arging(?:time)?ch)?ange|ecking)|(?:fstate|ell)change|u(?:echange|t)|l(?:ick|ose))|m(?:o(?:z(?:pointerlock(?:change|error)|(?:orientation|time)change|fullscreen(?:change|error)|network(?:down|up)load)|use(?:(?:lea|mo)ve|o(?:ver|ut)|enter|wheel|down|up)|ve(?:start|end)?)|essage|ark)|s(?:t(?:a(?:t(?:uschanged|echange)|lled|rt)|k(?:sessione|comma)nd|op)|e(?:ek(?:complete|ing|ed)|(?:lec(?:tstar)?)?t|n(?:ding|t))|u(?:ccess|spend|bmit)|peech(?:start|end)|ound(?:start|end)|croll|how)|b(?:e(?:for(?:e(?:(?:scriptexecu|activa)te|u(?:nload|pdate)|p(?:aste|rint)|c(?:opy|ut)|editfocus)|deactivate)|gin(?:Event)?)|oun(?:dary|ce)|l(?:ocked|ur)|roadcast|usy)|a(?:n(?:imation(?:iteration|start|end)|tennastatechange)|fter(?:(?:scriptexecu|upda)te|print)|udio(?:process|start|end)|d(?:apteradded|dtrack)|ctivate|lerting|bort)|DOM(?:Node(?:Inserted(?:IntoDocument)?|Removed(?:FromDocument)?)|(?:CharacterData|Subtree)Modified|A(?:ttrModified|ctivate)|Focus(?:Out|In)|MouseScroll)|r(?:e(?:s(?:u(?:m(?:ing|e)|lt)|ize|et)|adystatechange|pea(?:tEven)?t|movetrack|trieving|ceived)|ow(?:s(?:inserted|delete)|e(?:nter|xit))|atechange)|p(?:op(?:up(?:hid(?:den|ing)|show(?:ing|n))|state)|a(?:ge(?:hide|show)|(?:st|us)e|int)|ro(?:pertychange|gress)|lay(?:ing)?)|t(?:ouch(?:(?:lea|mo)ve|en(?:ter|d)|cancel|start)|ime(?:update|out)|ransitionend|ext)|u(?:s(?:erproximity|sdreceived)|p(?:gradeneeded|dateready)|n(?:derflow|load))|f(?:o(?:rm(?:change|input)|cus(?:out|in)?)|i(?:lterchange|nish)|ailed)|l(?:o(?:ad(?:e(?:d(?:meta)?data|nd)|start)?|secapture)|evelchange|y)|g(?:amepad(?:(?:dis)?connected|button(?:down|up)|axismove)|et)|e(?:n(?:d(?:Event|ed)?|abled|ter)|rror(?:update)?|mptied|xit)|i(?:cc(?:cardlockerror|infochange)|n(?:coming|valid|put))|o(?:(?:(?:ff|n)lin|bsolet)e|verflow(?:changed)?|pen)|SVG(?:(?:Unl|L)oad|Resize|Scroll|Abort|Error|Zoom)|h(?:e(?:adphoneschange|l[dp])|ashchange|olding)|v(?:o(?:lum|ic)e|ersion)change|w(?:a(?:it|rn)ing|heel)|key(?:press|down|up)|(?:AppComman|Loa)d|no(?:update|match)|Request|zoom))[\s\0]*=

Test: http://regex101.com/r/rV7zK8

Ich denke, es block 99% XSS, weil es ein Teil von NoScript, einem addon, bekommen regelmäßig aktualisiert

^(\s|\w|\d|<br>)*?$ 

Dadurch wird überprüft, Zeichen, Ziffern, Leerzeichen und auch die <br> tag.Wenn Sie wollen mehr Risiko können Sie weitere tags wie

^(\s|\w|\d|<br>|<ul>|<\ul>)*?$

Das größte problem durch die Verwendung von jeffs-code ist der @ die derzeit nicht zur Verfügung.

Ich würde wahrscheinlich einfach die "raw" - regexp-von jeffs code, wenn ich es brauchte, und fügen Sie ihn in

http://www.cis.upenn.edu/~matuszek/General/RegexTester/regex-tester.html

und sehen die Dinge brauchen Flucht bekommen entkam und dann verwenden es.


Unter Verwendung dieser regex-in der Geist, ich persönlich würde sicherstellen, dass ich genau verstanden, was ich Tat, warum und welche Folgen es hätte, wenn mir nicht gelingt, vor dem kopieren/einfügen nichts, wie die anderen Antworten, versuchen Sie, helfen Sie mit.

(Ja, das ist propbably ziemlich fundierte Beratung für alle kopieren/einfügen)

[\s\w\.]*.Wenn es nicht Spiel, Sie haben XSS.Vielleicht.Beachten Sie, dass dieser Ausdruck erlaubt nur Buchstaben, zahlen und Perioden.Es vermeidet alle Symbole, auch nützlich, diejenigen, die aus Angst vor XSS.Sobald Sie zulassen und Sie haben sorgen.Und nur das ersetzen aller Instanzen von & mit &amp; ist nicht ausreichend.Zu kompliziert, zu Vertrauen :P.Natürlich wird dies nicht zulassen, eine Menge von legitimen text (Sie können ersetzen Sie einfach alle übereinstimmenden Zeichen mit !oder so etwas), aber ich denke, es wird töten XSS.

Die Idee, nur analysiert werden, wie html generieren und html ist wahrscheinlich besser.

Ein Alter thread, aber vielleicht wird dies nützlich sein, für andere Benutzer.Es ist eine gepflegt-security-layer-tool für php: https://github.com/PHPIDS/ Es basiert auf einer Reihe von regex, die Sie hier finden können:

https://github.com/PHPIDS/PHPIDS/blob/master/lib/IDS/default_filter.xml

Diese Frage perfekt illustriert eine großartige Anwendung für das Studium der Theorie der Berechnung.Theorie der Berechnung ist ein Feld, das sich auf die Herstellung von mathematischen Darstellungen der Computer.

Einige der tiefsten der Forschung in die Berechnung der Theorie der Beweise, die illustrieren die Beziehungen der verschiedenen Sprachen.

Einige der Sprache der Beziehungen, die Berechnung Theoretiker erwiesen haben, umfassen:

enter image description here

Dies zeigt, dass Kontext-freie Sprachen sind mächtiger als die regulären Sprachen.Also, wenn Sie eine Sprache explizit Kontext-frei (Kontext-frei und nicht regelmäßig), dann ist es unmöglich für alle regulären Ausdruck zu erkennen.

JavaScript ist zumindest Kontext-frei, damit wir wissen, mit hundert prozentiger Sicherheit, dass die Gestaltung eines regulären Ausdrucks (regex) in der Lage, zu fangen alle XSS, ist eine Unmögliche Aufgabe.

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