¿Cuál es la forma correcta de codificar datos no confiables para el contexto de atributos HTML? Por ejemplo:PHP: HTML Codificación de atributo/JavaScript Decodificación
<input type="hidden" value="<?php echo $data; ?>" />
lo general el uso htmlentities()
o htmlspecialchars()
Para ello:
<input type="hidden" value="<?php echo htmlentities($data); ?>" />
Sin embargo, hace poco encontré con un problema por el que se trataba de romper mi solicitud cuando los datos que necesitaba para pasar era una URL que debía ser entregado fuera de JavaScript para cambiar la ubicación de esta página:
<input id="foo" type="hidden" value="foo?bar=1&baz=2" />
<script>
// ...
window.location = document.getElementById('foo').value;
// ...
</script>
En este caso, foo
es un programa C, y no comprende los caracteres codificados en la URL y segfaults.
Simplemente puedo tomar el valor en JavaScript y hacer algo como value.replace('&', '&')
, pero parece kludgy, y solo funciona para ampersands.
Entonces, mi pregunta es: ¿hay una mejor manera de ir sobre la codificación o decodificación de datos que se inyecta en los atributos de HTML?
He leído todo OWASP's XSS Prevention Cheatsheet, y me parece que siempre que tenga cuidado de citar mis atributos, entonces el único carácter que necesito codificar es la propia cita ("
) - en cuyo caso, yo podría usar algo como str_replace('"', '"', ...)
- pero no estoy seguro si lo estoy entendiendo correctamente.
No urlencode cuidar de que en PHP? Hay pocos ejemplos de código en los comentarios que muestran cómo protegerse contra XSS también en el manual de php. http://php.net/manual/en/function.urlencode.php – GillesC
@gillesc: 'urlencode()' es para codificar URL * parámetros *, no direcciones URL enteras, y no codifica para el contexto de atributo HTML. Hay una sección en el manual que incluso habla de esto: * "Déjalo como &, pero simplemente codifica tus URL usando htmlentities() o htmlspecialchars()." * – FtDRbwLXw6
¿estás seguro de 'window.location = document.getElementById ('foo'); '? debería ser así, creo-> 'window.location = document.getElementById ('foo'). value;' y redirige a la página de la derecha (foo? bar = 1 & baz = 2) – ocanal