È sicuro utilizzare jQuery sul lato server per la convalida dell'input dell'utente?

3

Sto pensando di usare jQuery sul lato server (node.js) per convalidare l'input dell'utente (tag filtro, rimuovere tutti gli attributi eccetto href , rel , target & style , modificare regole CSS che vengono applicate direttamente a un elemento e rimuovono i collegamenti javascript). Esempio di convalida del link js sotto:

$(userinput).find("a").each(function() {
    if (/^j/i.test($(this).attr("href").replace(/\s+/g, ""))) {
        $(this).remove();
    }
});

Ora è possibile che l'attaccante scriva un codice che consenta a jQuery di pensare che non sia HTML di escape, codifica o qualcosa del genere? JQuery è sicuro al 100% per questa operazione?

UPDATE

Per gli utenti interessati al codice.

    
posta noob 12.08.2012 - 16:24
fonte

5 risposte

6

Devi verificare che l'HTML sia valido (ad es. nidificazione corretta di ",", & lt ;, >). In caso contrario, i diversi browser utilizzeranno algoritmi diversi per "risolverlo". in loro vedono cose diverse come tag.

Inoltre, c'è un alto rischio di aggiungere troppo alla tua lista bianca. Ad esempio l'attributo href può contenere contenuto attivo. Ad esempio: jaVascript: , vbscRipt: , java scriPt: tra gli altri.

Su Internet Explorer esiste una funzione expression () che può essere utilizzata nei CSS per eseguire Javascript.

Consiglio vivamente di utilizzare una delle librerie esistenti per l'input dell'utente di sanità, come purificatore html .

Dai una buona occhiata al trucco XSS .

Ultimo ma non meno importante, tieni presente che un attacco potrebbe funzionare completamente senza javascript, compra l'iniezione di un modulo che richiede nome utente e password.

    
risposta data 12.08.2012 - 16:40
fonte
5

No, poiché sembra indicare che stai utilizzando jQuery (esperto nell'analisi di informazioni dai tag HTML) per eseguire la convalida dell'input all'utente che inserisce l'HTML che verrà quindi mostrato all'utente. Inserire nella lista bianca i tag HTML sicuri e inserire tag HTML non sicuri nella blacklist è il metodo sbagliato per impedire XSS.

Il metodo giusto utilizza un linguaggio di markup leggero come Markdown o reStructuredText per l'input dell'utente di dati formattati (come post di blog , commenti, ecc.). In questo modo l'utente può stilizzare il proprio testo in qualsiasi cosa desideri, aggiungere testo in grassetto o collegamenti all'interno del proprio commento con una sintassi come **make this bold** o [text for a link](http://www.example.com/fake/link) che converte sempre in html per essere visualizzato come <a href="http://www.example.com/fake/link">text for a link</a> nel browser dell'utente. In questo modo impediamo completamente di dire <script> di inserimento di file javascript o onclick onmouserover form con attributi di azione in quanto il tuo linguaggio di markup sicuro limitato è impostato per non consentire tali tag o attributi generali.

È garantito che devi impostare la lingua in safe_mode dove caratteri speciali in particolare < , > , & , " , ' sono escape HTML (in &lt; , &gt; , &amp; &quot; e &#39; che verranno visti dall'utente come il carattere reale senza essere interpretati dal browser come sorgente HTML parte), non è possibile assegnare attributi ( attributes=false ) immesso (es. onclick ), oltre a richiedere che i collegamenti inizino con una lista bianca limitata; ad es., http , // , / , ftp , mailto , news , quindi non inavvertitamente lascia che gli utenti inseriscano javascript come protocollo nei loro collegamenti.

(Questo può essere ottenuto anche filtrando l'input raw attraverso il purificatore HTML, se vuoi che i tuoi utenti possano scrivere HTML dritto come nella risposta di Hendrik.)

In questo modo con un linguaggio di markup leggero e maturo, non ti dimenticherai di rimuovere qualcosa, a prescindere da quanto sia oscuro o come la tua libreria jQuery non abbia rilevato HTML malformato mentre lo disinfetti, ma un particolare browser ha fatto .

    
risposta data 12.08.2012 - 18:50
fonte
3

No. Non è sicuro. I browser variano notevolmente nel modo in cui analizzano determinati tipi di input (specialmente per HTML "non valido", dove "non valido" qui non è particolarmente ben definito, ma a volte anche per HTML "valido"). Questo fornisce un gran numero di modi sottili per importare codice HTML errato nel tuo documento HTML, senza che jQuery lo capisca.

La radice del problema non è jQuery; la radice del problema è il tuo approccio generale alla sanitizion HTML. Ho eseguito alcuni esperimenti, incaricando gli altri di scrivere disinfettanti HTML. Ho scoperto che ben oltre i 2/3 diventano insicuri. Quindi, la mia raccomandazione è: non scrivere il tuo disinfettante HTML. Molto probabilmente ti sbagli.

Invece, suggerisco di usare una libreria di disinfettanti HTML esistente. Suggerisco di usare disinfettante HTML OWASP , Purificatore HTML , o NeatHtml ; sono ben progettati e ben considerati.

    
risposta data 12.08.2012 - 18:21
fonte
0

Ci sono un sacco di stranezze del browser che potrebbero ingannare i comportamenti del browser. I browser hanno motori diversi, che potrebbero portare a parsing di parti di HTML modificate dalla sintassi in modi diversi. Qui è un esempio di comportamento inaspettato (ti consiglio di leggere questo libro, se vuoi saperne di più)

Inoltre, non puoi essere sicuro, cosa porterà il futuro. I nuovi tag o attributi potrebbero essere aggiunti. Il modo più corretto è evitare la lista nera e creare la lista bianca di tag accettabili.

    
risposta data 15.08.2012 - 19:22
fonte
-2

Ecco come funziona la normalizzazione javascript / jquery:

var userinput = "<a href='javascript:alert(\"<iframe>\")'>\
<embed> </embed>\
<object classid='buggy plugin' hostileparams='' />\
<html></html> <script></script> < > <htmlx> </a> < > <> \
<htmz> <></a>\
<![CDATA[ > <script type=\"text/javascript\">document.write(\"X\")</script> ]]>";

var x = jQuery('<div/>').html(userinput);
var y = x;
document.write(jQuery('<div/>').text(x.html()).html());
document.write("<br/>" + y.html());

Output:

X<a href='javascript:alert("<iframe>")'><embed> \
<object classid="buggy plugin" hostileparams="">\
</object> &lt; &gt; <htmlx> </htmlx></a>\
&lt; &gt; &lt;&gt; <htmz> &lt;&gt;<!--[CDATA[ --> ]]&gt;</htmz>
  < > < > <> <> ]]>

Questo è strano!

    
risposta data 12.08.2012 - 16:50
fonte

Leggi altre domande sui tag