2010-09-20 8 views
9

Ho avuto una regex come prima linea di difesa contro XSS.Regex come prima linea di difesa contro XSS

public static function standard_text($str) 
{ 
    // pL matches letters 
    // pN matches numbers 
    // pZ matches whitespace 
    // pPc matches underscores 
    // pPd matches dashes 
    // pPo matches normal puncuation 
    return (bool) preg_match('/^[\pL\pN\pZ\p{Pc}\p{Pd}\p{Po}]++$/uD', (string) $str); 
} 

È in realtà da Kohana 2.3.

Viene eseguito su testo inserito pubblico (nessun HTML mai) e nega l'input se non supera questo test. Il testo viene sempre visualizzato con htmlspecialchars() (o in particolare, Kohana's flavour, aggiunge il set di caratteri tra le altre cose). Ho anche messo un strip_tags() in uscita.

Il client ha avuto un problema quando voleva inserire del testo con parentesi. Ho pensato di modificare o estendere l'helper, ma ho anche avuto un pensiero secondario - se permetto le virgolette doppie, c'è davvero qualche ragione per cui ho bisogno di validare del tutto?

Posso semplicemente fare affidamento sull'uscita in uscita?

risposta

5

Non è mai sicuro affidarsi a Regex per filtrare pericolosi attacchi XSS. E sebbene tu non stia facendo affidamento su di essi, l'escaping dell'output e il filtraggio degli input, se usati correttamente, uccideranno tutti i tipi di attacchi. Pertanto, non ha senso avere Regex come "prima linea di difesa" quando il loro aiuto non è realmente necessario. Come tu e il tuo cliente avete scoperto, complicano le cose solo se usate in questo modo.

Per farla breve: se si utilizza html_entities o htmlspecialchars per sfuggire l'output, non hai bisogno di espressioni regolari e non avete veramente bisogno strip_tags sia.