2009-02-27 8 views
7

Un utente immetterà testo in un'area di testo. Viene quindi inserito direttamente in un database mySQL. Uso trim, htmlentities, mysql_real_escape_string e ho abilitato le virgolette magiche. Come dovrei sanitizzarlo quando restituisco quei dati in una textarea?Come si disinfettano correttamente i dati ricevuti da un'area di testo, quando si esegue di nuovo l'output nell'area di testo?

Grazie per il vostro aiuto. Non sono mai stato troppo sicuro sul modo corretto di farlo ...

+0

Suggerirei di disabilitare le virgolette magiche, causerà solo problemi in seguito. –

risposta

14

Non è necessario utilizzare htmlentities quando lo si salva. Dovresti usare htmlentities durante la visualizzazione. La regola empirica non è quella di codificare/disinfettare i dati finché non è necessario. Se si esegue htmlentities su di esso quando si salva, è necessario eseguire html_entity_decode sul testo quando l'utente desidera modificare l'input. Quindi tu sterilizzi per quello di cui hai bisogno e niente di più. Al momento del salvataggio, è necessario disinfettare per l'iniezione SQL, quindi è mysql_real_escape_string esso. Durante la visualizzazione, è necessario disinfettare per XSS, quindi è htmlentities esso.

Inoltre, non sono sicuro di aver visto il commento di Darryl Hein, ma in realtà non si desidera abilitare magic_quotes. They are a bad, bad, thing e sono stati ritirati del tutto in PHP 6.

+0

Dovrebbe essere l'unica precauzione che prendo? –

+0

Se stai bene non permettendo l'HTML in qualunque sia la stringa, è tutto. Se vuoi che l'HTML sia permesso, vai su una strada molto pericolosa di liste bianche e quant'altro. –

+0

Solo una nota a margine, questo è vero anche quando il BBCode analizza troppo? –

2

In aggiunta alla risposta di Paolo su quando utilizzare htmlentities(), a meno che non si stia utilizzando una versione precedente di PHP, il modo corretto di disinfettare per l'inserimento in un DB mysql deve utilizzare Prepared Statements che fanno parte di mysqli extension. Questo sostituisce qualsiasi necessità di utilizzare mysql_real_escape_string().

Oltre a questo, penso che tu abbia le cose coperte.

+1

nota che l'uso di istruzioni preparate non è sufficiente, devi usare i parametri associati. IOW: usare '?' nella stringa SQL e inviare i dati con stmt-> bind_param() – Javier

+0

Nei normali flussi di lavoro, non si desidera rilevare il testo non valido prima di raggiungere la dichiarazione di preparazione? In tal caso, non è adatto usare mysql_real_escape_string – AlxVallejo