L’HTML codifica l’input dell’utente durante la memorizzazione o la visualizzazione

Semplice domanda che continua a infastidirmi.

Dovrei codificare HTML l’input dell’utente subito e memorizzare i contenuti codificati nel database, o dovrei memorizzare i valori grezzi e la codifica HTML durante la visualizzazione?

La memorizzazione dei dati codificati riduce notevolmente il rischio che uno sviluppatore si dimentichi di codificare i dati quando vengono visualizzati. Tuttavia, la memorizzazione dei dati codificati renderà il datamining un po ‘più ingombrante e occuperà un po’ più di spazio, anche se di solito non è un problema.

Suggerisco caldamente di codificare le informazioni all’uscita. la memorizzazione di dati grezzi nel database è utile se si desidera modificare il modo in cui viene visualizzato in un determinato punto. il stream dovrebbe essere qualcosa di simile a:

sanitize user input -> protect against sql injection -> db -> encode for display 

pensa a una situazione in cui potresti voler visualizzare le informazioni come un feed RSS. dover ripetere qualsiasi codifica specifica HTML prima di re-display sembra un po ‘sciocco. qualsiasi sviluppo dovrebbe sempre seguire il meme “non fidarsi dell’input”, sia che l’input provenga da un utente o dal database.

La codifica dovrebbe essere eseguita solo sul display. Senza eccezioni.

Produzione.

Con l’HTML non puoi semplicemente controllare la lunghezza di una stringa ( & 1 è un carattere, ma strlen() ti dirà 5), puoi facilmente ritagliarlo (potrebbe rompere le quadro).

Potrebbe essere necessario combinare stringhe dal database con stringhe da un’altra fonte, oppure leggerle e scriverle di nuovo. Fare questo in tutta l’applicazione senza perdere la fuga ed evitando la doppia fuga è un incubo.

PHP ha provato a fare cose simili con magic_quotes e si è rivelato un enorme fallimento. Non prendere la rotta magic_entities ! 🙂

Tieni presente che potrebbe essere necessario accedere al database con qualcosa che non comprende il testo codificato in HTML (ad esempio, uno strumento di segnalazione). Sono d’accordo che lo spazio è un non-problema, ma IMHO, mettendo la codifica HTML nel database sposta la conoscenza della vista / front-end nel livello più basso dell’applicazione, e questo è un errore di progettazione.

Questo non sconfigge lo scopo della codifica? Se uno script sql malevolo viene inserito come input, che viene poi passato al db potrebbe causare un enorme problema.