Funzioni PHP per prevenire XSS

12

Esiste una libreria comprovata con funzioni per prevenire gli attacchi XSS? Molte persone non si rendono conto che htmlspecialchars non è sufficiente per prevenire gli attacchi XSS. Esistono vari contesti che necessitano di una propria escaping (proprietà html, Javascript, altro?). Esiste una libreria comprovata che fornirà a me funzioni per evadere in tutti questi contesti?

    
posta Casebash 09.11.2011 - 22:36
fonte

4 risposte

9

Sì, ci sono diverse librerie di questo tipo. La scelta della libreria dipende da quale linguaggio / framework di programmazione web stai usando.

Per prima cosa, devi iniziare leggendo XSS. Raccomando il seguente documento:

Successivamente, una volta acquisito familiarità con questo, posso indicarti alcune librerie che forniscono funzioni di escape ben testate:

Tuttavia, ti avverto che l'utilizzo di queste funzioni richiede conoscenze dello sviluppatore ed è potenzialmente soggetto a errori. Esistono molti diversi contesti di analisi in cui i dati dinamici possono essere iniettati in HTML, CSS o contenuto Javascript; ogni contesto di analisi può richiedere l'applicazione di una funzione di escape diversa (o una sequenza di funzioni di escape). Lo sviluppatore deve assicurarsi di applicare le funzioni di escape corrette ogni volta che inserisce dati dinamici in tali contenuti. Ciò richiede la conoscenza dei rischi dell'XSS e come difendersi da essi.

Questo approccio (eseguire manualmente l'escape dei dati ovunque venga utilizzato) è anch'esso soggetto a errori. È facile dimenticare di applicare una funzione di escape. Se hai 100 posti in cui inserisci dati dinamici nel documento, sarebbe facile ricordarli in 99 luoghi e inavvertitamente dimenticarti di scappare in uno di essi. Siamo solo umani, e questi tipi di errori sono facili da fare. Le librerie di funzioni di escape non aiutano gli sviluppatori a evitare questo problema.

Una soluzione migliore è usare un framework di programmazione web che aiuti gli sviluppatori a evitare questo problema. Lo state-of-the-art è auto-igienizzazione sensibile al contesto. Questo funziona particolarmente bene con framework che forniscono un sistema di template HTML. In tale sistema, il motore di template è responsabile per l'escape automatico di tutti i dati non statici che sono interpolati nel modello. Poiché il motore di template può identificare il contesto di analisi in cui i dati vengono inseriti dinamicamente, il motore di template può selezionare e applicare automaticamente la corretta funzione di escape.

Il problema principale con l'auto-disinfezione sensibile al contesto è che solo pochi framework di programmazione web attualmente lo supportano. Alcuni framework web che supportano l'auto-disinfezione sensibile al contesto: Google Ctemplate (Modelli di chiusura ), GWT, Google Clearsilver.

Per ulteriori informazioni su questo argomento, posso consigliare vivamente il seguente documento di ricerca:

risposta data 11.11.2011 - 06:00
fonte
4

Invece di usare l'escaping sensibile al contesto (probabilmente ci sono varie librerie PHP che cercano di andare in questo modo), consiglierei di usare un parser XSS pieno di HTML che creerà un albero dei documenti e consentirà solo gli elementi della whitelist, attributi selezionati ecc.

I progetti che adottano questo approccio sono HTMLPurifier e Wibble . Ad esempio, Wibble:

  • Converte tutti gli input HTML in HTML sicuro UTF-8
  • Carica l'HTML in un oggetto DOMDocument
  • Applica uno o più filtri (manipolatori DOM) al DOM HTML
  • Estrae il codice HTML filtrato dal DOM e applica HTML Tidy (ext / tidy)
  • Converte l'HTML finale nella codifica dei caratteri selezionata dall'utente (se non UTF-8)

Non c'è spazio per un codice malevolo proveniente da una sintassi HTML quasi valida per passare attraverso questo. Se c'è qualcosa di sbagliato nell'HTML, molto probabilmente sarà la tua lista bianca incompleta (o qualche strano vettore di attacco html / ordine, ma ne dubito).

Aggiornamento: Se non hai bisogno di un parser HTML in piena regola, un'altra opzione è quella di utilizzare il motore di templating sicuro per default. L'unico progetto PHP con escape sensibile al contesto che conosco è Nette Latte motore di template, non l'ho usato comunque. Anche altri motori hanno diverse tecniche di escape, ma è necessario specificare il contesto da soli (e se si omette il contesto una volta, si è aperti agli attacchi XSS). Esempi sono Twig o Smarty . Puoi semplicemente togliere il codice di escape da quelli per utilizzarlo al di fuori del motore dei template.

    
risposta data 09.11.2011 - 23:11
fonte
3

La soluzione migliore contro XSS è che i programmatori capiscano in che modo i dati possono essere pericolosi e utilizzano l'escaping sensibile al contesto quando emettono dati. Sempre. Fa in modo che i programmatori riflettano su quello che stanno facendo e forniscano programmi più robusti. Non vedo alcun problema con questo approccio: -)

    
risposta data 10.11.2011 - 12:35
fonte
3

Ci sono due cose da tenere a mente:

  1. Esci sempre sull'output, non sull'input.
  2. Puoi mettere in cache il tuo output in uscita se sei preoccupato per il rendimento.

Il depuratore HTML è buono, ma è cieco al contesto in cui è utilizzato. Il codice seguente è vulnerabile:

<input type="text" name="test" value="<?php echo $hp->purify($_GET['foo']); ?>" />

Prova del concetto: /?foo=test%22%20onload%3D%22alert(%27XSS%27)%3B

Escaping basato sul contesto di solito è qualcosa che acquisisci solo attraverso il tuo motore di template. Il caso più generale:

  • Devi consentire l'HTML?
    • Sì: utilizza HTMLPurifier o Stauros. (Di più su questo sotto).
    • No: Usa htmlentities() con ENT_QUOTES ; specifica il set di caratteri (ad esempio 'UTF-8' ).

Se sei preoccupato delle prestazioni di esecuzione dei dati forniti dall'utente tramite HTMLPurifier su ciascuna richiesta, fornisci la libreria Stauros XSS un vortice. (Il readme dice che è ancora sperimentale, ma devo ancora trovare un modo per aggirarlo.)

    
risposta data 01.01.2016 - 08:16
fonte

Leggi altre domande sui tag