2011-09-02 17 views
6

Questo è stato chiesto prima, ma ho bisogno di chiarezza al 100% su questo problema, perché è molto importante per me farlo bene.PHP XSS Domanda/chiarimento

La situazione: un sistema di messaggi su un sito web. L'utente inserisce un messaggio in una casella di testo, inviano il modulo e viene inserito nel database. Questi dati possono quindi essere richiamati dal database e visualizzati all'interno dei tag <span> con un altro utente.

Quali procedure di sicurezza è necessario adottare per evitare che questi dati siano dannosi? Uso già mysql_real_escape_string per interrompere qualsiasi iniezione e strip_tags sembra utile ma ho sentito nominare molti altri nomi. Cosa devo usare per proteggere questi dati considerando che è visualizzato solo nei tag <span>?

Grazie.

+0

possibile duplicato di [PHP: Come prevenire totalmente gli attacchi XSS?] (Http://stackoverflow.com/questions/5934063/php-how-to-totally-prevent-xss-attacks) –

+0

Giusto per chiarire, I "Segnalo come un duplicato non perché è una cattiva domanda (non lo è!) - tutti dovrebbero essere così diligenti –

+0

La linea di fondo qui è quella di sanificare sempre tutti i dati forniti dall'utente, non importa quanto insignificanti. – Jrod

risposta

3

L'idea sbagliata è che si vuole sfuggire all'input, il che è sbagliato. Devi filtrare l'output (e il database è anche un output).

Significa che quando il modulo viene inviato, si utilizza mysql_real_escape_string() per inviare (output) dati al database e si utilizza htmlspecialchars() per stampare il contenuto sullo schermo. Lo stesso principio si applica alle espressioni regolari, dove devi usare preg_quote() e così via.

Non importa da dove provengano i dati, è necessario sfuggirli nel contesto in cui si sta inviando.

Pertanto, per evitare attacchi XSS, è necessario utilizzare htmlspecialchars()/htmlentities(). mysql_real_escape_string non ha nulla a che fare con XSS (ma devi ancora usarlo quando stai inviando dati al database).

+0

Sapevo che mysql_real_escape_string era un po 'irrilevante a questo argomento ma ne ho parlato per evitare che qualcuno dicesse "devi farlo anche tu!" :) Quando metti una barra tra htmlspecialchars e htmlentities, stai dicendo di usare entrambi o usare uno o l'altro? che è migliore? inoltre, qual è il preg_quote() per? Non sono sicuro al 100% esattamente cosa intendi quando dici quando lo stai usando in un'espressione regolare (anche se ho cercato su Google la definizione!: D) – James

+2

James, egli menziona 'preg_quote' in un senso che» usa il «giusto» strumento per il lavoro giusto «=» usa la funzione corretta e raccomandata per l'escape di input per determinati domini/contesti (htmlspecialchars per html, mysqli_real_escape_string per mysql dbs, istruzioni preparate per praticamente qualsiasi db, preg_quote per espressioni regolari compatibili con perl, escapeshellarg/escapeshellcmd per comandi shell, ecc.) « – knittl

+0

+1 per la distinzione tra input e output. Se non dovrebbe essere HTML, non validarlo/filtrarlo come tale (usando 'strip_tags()'). –

3

Utilizzare htmlspecialchars durante l'output su una pagina HTML. Visualizzerà i dati nello stesso modo in cui l'utente li ha immessi (così gli utenti possono usare qualcosa come <3 nei loro messaggi senza spogliarli)

+0

e questo da solo proteggerà contro tutti i tipi di XSS considerando che sto solo inserendo il contenuto all'interno dei tag '' e non all'interno di oggetti html? Sono sicuro di aver letto altrove che la gente ha detto che era vecchio e inutile? – James

+0

@James: 'htmlentities' è un'alternativa migliore se disponibile sul tuo sistema, ma funzioneranno entrambi alla perfezione. –

+0

James, questo è totalmente sicuro quando si invia il testo all'interno di "". Non è vecchio e inutile, è raccomandato. ['htmlspecialchars'] (http://php.net/htmlspecialchars) per l'output e [istruzioni preparate] (http://php.net/mysqli_prepare)/[' mysqli_real_escape_string'] (http://php.net/mysqli_real_escape_string) – knittl

0

Controllare la scheda Cheat di prevenzione OWASP XSS. Spiegherà come evitare l'XSS per diversi contesti. Htmlentities dovrebbe fare il lavoro quando tra tag.