Qual è il modo corretto di codificare i dati non attendibili per il contesto degli attributi HTML? Per esempio:PHP: codifica degli attributi HTML/decodifica JavaScript
<input type="hidden" value="<?php echo $data; ?>" />
Io di solito uso htmlentities()
o htmlspecialchars()
per fare questo:
<input type="hidden" value="<?php echo htmlentities($data); ?>" />
Tuttavia, di recente ho incontrato un problema in cui questa è stata la rottura la mia domanda, quando i dati che ho bisogno di passare era un URL che doveva essere consegnato fuori a JavaScript di cambiare la posizione della pagina:
<input id="foo" type="hidden" value="foo?bar=1&baz=2" />
<script>
// ...
window.location = document.getElementById('foo').value;
// ...
</script>
In questo caso, foo
è un programma C, e non capisce i caratteri codificati nell'URL e nei segoult.
Posso semplicemente prendere il valore in JavaScript e fare qualcosa come value.replace('&', '&')
, ma sembra kludgy e funziona solo per la e commerciale.
Quindi, la mia domanda è: c'è un modo migliore per fare la codifica o la decodifica dei dati che vengono iniettati in attributi HTML?
Ho letto tutto di OWASP's XSS Prevention Cheatsheet e mi sembra che fintanto che sto attento a citare i miei attributi, quindi l'unico carattere che ho bisogno di codificare è la citazione stessa ("
) - nel qual caso, I potrebbe usare qualcosa come str_replace('"', '"', ...)
- ma, non sono sicuro se sto capendo correttamente.
Non urlencode prendersi cura di questo in PHP? Ci sono alcuni esempi di codice nei commenti che mostrano come proteggersi anche dall'XSS sul manuale php. http://php.net/manual/en/function.urlencode.php – GillesC
@gillesc: 'urlencode()' è per encoding URL * parameters *, non interi URL e non codifica per il contesto dell'attributo HTML. C'è una sezione nel manuale che parla anche di questo - * "Lascia come &, ma semplicemente codifica i tuoi URL usando htmlentities() o htmlspecialchars()." * – FtDRbwLXw6
sei sicuro di 'window.location = document.getElementById ('foo'); '? che dovrebbe essere così penso-> 'window.location = document.getElementById ('foo'). value;' e reindirizza alla pagina giusta (foo? bar = 1 & baz = 2) – ocanal