2013-01-10 13 views
10

Ho un modulo con una casella di testo che registra i dati su un file php che utilizza la funzione "htmlentities" per rendere sicura l'email al proprietario del sito web.PHP htmlentities non è sufficiente per impedire agli hacker di iniettare codice HTML dal modulo

Il problema è che qualcuno è riuscito a ottenere un collegamento ipertestuale nel testo e htmlentities() non lo rimuove.

Questo è il mio testo HTML:

<input name="usertext" type="text" /> 

Questo è il mio codice PHP che riceve i dati sul post (ho lasciato il codice email fuori perché non è questo il problema che ho cambiato l'eco solo i dati ricevuti così. potrei provare a replicare quello che l'hacker ha fatto Se so come ha fatto, riesco a trovare un modo per impedire che accada):.

echo trim(htmlentities($_POST["usertext"], ENT_QUOTES)); 

Ora l'hacker inviano alcuni dati e questo era l'html risultato (il codice sorgente - significa che mostrava un normale collegamento nel browser):

<a target="_blank" href="mailto:[email protected]">[email protected]</a> 

Ho pensato che htmlentities() avrebbe sempre impedito a chiunque di immettere html di qualsiasi tipo. Se entro in un collegamento ipertestuale come ad esempio:

<a href="aaa" /> 

ottengo:

&lt;a href="aaa" /&gt; 

Ma il testo del hacker non è stato codificato come quello.

Quindi le mie domande sono:

  1. Come ha fatto l'hacker inserire tag HTML in modo che i htmlentities function() non ha fatto nulla ad esso?
  2. Come dovrei replicarlo per il test? (potrebbe rispondere alla domanda precedente)

Ho fatto qualche ricerca e potrebbe essere possibile che l'hacker abbia codificato il suo testo in utf-7 o qualcosa del genere?

Ho già ricevuto alcune email con questi stessi collegamenti. Questo hacker sta ovviamente testando il mio sito Web per vedere se può fare XSS o qualcosa del genere.

+0

Registrare la richiesta non elaborata con il contenuto del campo $ _POST ["usertext"] quando inviato. È inoltre possibile aggiungere una codifica a htmlentities che dovrebbe corrispondere alla codifica del contenuto. – MatsLindh

+0

Hai controllato JavaScript incluso da qualche parte, forse è stato creato dinamicamente? – martinstoeckli

+0

Codifica correttamente il contenuto HTML prima dell'invio? – inhan

risposta

4

Bella domanda! Penso che tu possa leggere questo link che spiega il problema e fornisce una soluzione.

La soluzione proposta è specificare nel browser (tramite un meta tag) quale charset viene utilizzato nella pagina.

+0

Grazie. Quel collegamento è molto interessante e sembra che l'hacker possa aver usato utf-7. L'unico problema è che quando copio gli esempi utf-7 nella mia casella di testo e lo invio, il browser mostra solo i caratteri esatti e non li converte in tag html. Ad ogni modo, sembra essere l'unico modo in cui l'hacker probabilmente lo farà. Specificherò utf-8 dove posso ad esempio (php code) header ('Content-Type: text/html; charset = utf-8'); Potrebbe funzionare. Dal momento che non riesco a replicare ciò che ha fatto l'hacker, non saprò mai se funziona fino a quando non ci riproverà :) – Daniel

0

Questa non è la soluzione più elegante, ma senza vedere il resto del codice, è possibile verificare se il campo usertext contiene la stringa "href" e negarlo.

+0

Questo è un modo e lo farò se nessuno riuscirà a capire come l'hacker ha superato la funzione htmlentities – Daniel

0

Sarebbero htmlspecialchars() fare il trucco? Questo article su W3Schools sembra suggerire che.

Problemi correlati