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