Domanda

Jeff in realtà ha pubblicato un post su questo in Disinfettare l'HTML.Ma il suo esempio è in C# e in realtà sono più interessato a una versione Java.Qualcuno ha una versione migliore per Java?Il suo esempio è sufficiente per convertire direttamente da C# a Java?

[Aggiornamento] Ho messo una taglia su questa domanda perché SO non era così popolare quando ho posto la domanda come lo è oggi (*).Per quanto riguarda tutto ciò che riguarda la sicurezza, più persone se ne occupano, meglio è!

(*) In effetti, penso che fosse ancora in versione beta chiusa

È stato utile?

Soluzione

Non farlo con le espressioni regolari.Ricorda, non stai proteggendo solo dall'HTML valido;ti stai proteggendo dal DOM creato dai browser web.I browser possono essere indotti con l'inganno a produrre DOM validi da HTML non validi abbastanza facilmente.

Ad esempio, vedere questo elenco di attacchi XSS offuscati.Sei pronto a personalizzare una regex per prevenire questo attacco nel mondo reale Yahoo e Hotmail su 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>

Che ne dici di questo attacco che funziona su IE6?

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

Che ne dici degli attacchi che non sono elencati su questo sito?Il problema con l'approccio di Jeff è che non si tratta di una whitelist, come affermato.Come qualcuno su quella pagina nota giustamente:

Il problema è che l'HTML deve essere pulito.Ci sono casi in cui è possibile passare in HTML hackerato e non lo corrisponde, nel qual caso restituirà la stringa HTML hackerata in quanto non corrisponde a nulla per sostituire.Questo non è strettamente whitelisting.

Suggerirei uno strumento appositamente creato come AntiSamy.Funziona effettivamente analizzando l'HTML, quindi attraversando il DOM e rimuovendo tutto ciò che non è presente nel file configurabile lista bianca.La differenza principale è la capacità di gestire con garbo HTML non valido.

La parte migliore è che in realtà esegue test unitari per tutti gli attacchi XSS sul sito sopra indicato.Inoltre, cosa potrebbe essere più semplice di questa chiamata API:

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();
}

Altri suggerimenti

Non sono convinto che l'uso di un'espressione regolare sia il modo migliore per trovare tutto il codice sospetto.Le espressioni regolari sono abbastanza facili da ingannare, specialmente quando si ha a che fare con HTML non funzionante.Ad esempio, l'espressione regolare elencata nel collegamento Sanitize HTML non riuscirà a rimuovere tutti gli elementi "a" che hanno un attributo compreso tra il nome dell'elemento e l'attributo "href":

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

Un modo più efficace per rimuovere codice dannoso è affidarsi a un parser XML in grado di gestire tutti i tipi di documenti HTML (Tidy, TagSoup, ecc.) e selezionare gli elementi da rimuovere con un'espressione XPath.Una volta che il documento HTML è stato analizzato in un documento DOM, gli elementi da rimuovere possono essere trovati in modo facile e sicuro.Questo è anche facile da fare con XSLT.

Ho estratto da NoScript il miglior componente aggiuntivo Anti-XSS, ecco il suo Regex:Lavoro impeccabile:

<[^\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

Penso che blocchi il 99% di XSS perché fa parte di NoScript, un componente aggiuntivo che viene aggiornato regolarmente

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

Ciò convaliderà i caratteri, le cifre, gli spazi bianchi e anche il file <br> etichetta.Se vuoi più rischi puoi aggiungere più tag come

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

Il problema più grande utilizzando il codice Jeff è la @ che attualmente non è disponibile.

Probabilmente prenderei semplicemente l'espressione regolare "grezza" dal codice di Jeff se ne avessi bisogno e la incollerei

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

e vedere le cose che necessitano di fuga scappare e poi usarle.


Tenendo presente l'utilizzo di questa regex, mi assicurerei personalmente di aver capito esattamente cosa stavo facendo, perché e quali conseguenze ci sarebbero se non ci riuscissi, prima di copiare/incollare qualsiasi cosa, come le altre risposte cercano di aiutarti.

(Probabilmente questo è un buon consiglio per qualsiasi copia/incolla)

[\s\w\.]*.Se non corrisponde, hai XSS.Forse.Tieni presente che questa espressione consente solo lettere, numeri e punti.Evita tutti i simboli, anche quelli utili, per paura di XSS.Una volta che permetti &, hai preoccupazioni.E semplicemente sostituendo tutte le istanze di & con &amp; non è sufficiente.Troppo complicato per fidarsi: P.Ovviamente questo non consentirà molto testo legittimo (puoi semplicemente sostituire tutti i caratteri non corrispondenti con un !o qualcosa del genere), ma penso che ucciderà XSS.

L'idea di analizzarlo semplicemente come html e generare nuovo html è probabilmente migliore.

Discussione vecchia ma forse potrà essere utile ad altri utenti.Esiste uno strumento di livello di sicurezza mantenuto per php: https://github.com/PHPIDS/ Si basa su una serie di espressioni regolari che puoi trovare qui:

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

Questa domanda illustra perfettamente una grande applicazione dello studio della teoria del calcolo.La teoria del calcolo è un campo che si concentra sulla produzione di rappresentazioni matematiche dei computer.

Alcune delle ricerche più approfondite nella teoria computazionale riguardano le prove che illustrano le relazioni tra vari linguaggi.

Alcune delle relazioni linguistiche che i teorici del calcolo hanno dimostrato includono:

enter image description here

Ciò dimostra che i linguaggi liberi dal contesto sono più potenti dei linguaggi normali.Pertanto, se una lingua è esplicitamente libera dal contesto (libera dal contesto e non regolare), allora è impossibile for Qualunque espressione regolare per riconoscerlo.

JavaScript è per lo meno libero dal contesto, quindi sappiamo con certezza al cento per cento che progettare un'espressione regolare (regex) in grado di catturare tutti gli XSS è un compito impossibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top