La URL sería¿Qué es "lo suficientemente desinfección" para una dirección URL
- guarda en una base de datos MySQL
- Se utiliza para mostrar una imagen en el perfil del usuario
haría strip_tags() y mysql_real_escape_string() será suficiente?
La URL sería¿Qué es "lo suficientemente desinfección" para una dirección URL
haría strip_tags() y mysql_real_escape_string() será suficiente?
"Basta sanitización" depende completamente del entorno del que se trate. La desinfección para MySQL se debe considerar completamente separada de la desinfección para salida web, y debe manejarlas por separado para evitar muchas molestias.
Desinfección para MySQL
mysql_real_escape_string()
va a desinfectar un fragmento de datos y hacerla segura para poner dentro de una consulta SQL.Desinfección para la salida
htmlspecialchars($val)
a la hora de salida impedirá cualquier etiqueta maliciosos de que se queden, porque <
y >
caracteres se convierten en sus representaciones entidad y no representan como delimitadores de etiquetas.ENT_QUOTES
si está dando salida algo que está dentro de atributo citado de un elemento HTML, como <input name="email" value="<?php echo htmlspecialchars($email,ENT_QUOTES); ?>" />
Eso debería ser todo lo que necesita, a menos que tenga necesidades especiales. strip_tags()
no debería usarse realmente para la desinfección, ya que se puede engañar con HTML mal formado. La desinfección es un objetivo digno, y si puede mantener sus contextos separados, se encontrará con menos problemas con la manipulación de datos entre ellos.
+1 por solo desinfectar cuando sea necesario. Por supuesto, desinfectar para SQL es * evil *, solo use consultas parametrizadas ... – sleske
@sleske - sí, esa es la sabiduría predominante en estos días. Sanitizing para SQL no es malo sin embargo. Muchos sistemas utilizarán versiones o controladores de bases de datos más antiguos, y es posible que no tengan acceso a MySQLi. La única razón por la que desinfectar recibe una mala reputación es porque la gente * se olvida de hacerlo *. Las consultas preparadas simplemente resumen la desinfección manual (entre otras ventajas). – zombat
¿Qué quiere decir "consultas parametrizadas"? – aslum
Probablemente sea más seguro y mejor llamar a htmlentities() en la cadena en lugar de contar con strip_tags().
strip_tags() no eliminará caracteres HTML especiales como '"&
por ejemplo, si su código es:
<img src="<?= strip_tags($myVar) ?>">
y
$myVar = '">something goes here<';
continuación, se termina con:
<img src="">something goes here<">
Que es, obviamente, la raíz de un agujero XSS; un exploit real se deja como un ejercicio para el lector.
inicialmente upvoted respuesta de Frank, pero pensado en un problema: htmlentities() se rompen las direcciones URL legales como esto:
http://www.mywebsite.com/profile?id=jojo&w=60&h=60
Tal vez pelado paréntesis angulares + mysql_real_escape sería suficiente?
Sin embargo, ¿una URL de imagen no debería tener símbolos y símbolos? – aslum
¿Por qué no? Un script es una fuente de imágenes perfectamente válida. –
htmlentities() funcionará bien en esa URL. De hecho, la codificación y como & en sus atributos es requerida por los estándares. '' es html válido (y el navegador interpetendrá la URL como 'example.com/? A & b' como se esperaba). Por otro lado, '
' no es válido, pero los navegadores probablemente hagan lo correcto de todos modos. Por ejemplo, si ve el código fuente en la URL de su publicación, verá que SO utiliza & en el atributo href. –
Recibí algunas buenas respuestas a una pregunta similar; echa un vistazo a http://stackoverflow.com/questions/549987/what-is-the-best-way-to-filter-urls-for-input si lo deseas. La mejor solución es, probablemente, reconstruir completamente la URL como sugiere la respuesta de Mike Boers. – JAL