2010-01-12 14 views
8

La URL sería¿Qué es "lo suficientemente desinfección" para una dirección URL

  1. guarda en una base de datos MySQL
  2. Se utiliza para mostrar una imagen en el perfil del usuario

haría strip_tags() y mysql_real_escape_string() será suficiente?

+1

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

Respuesta

16

"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.
  • Cualquier otro tipo de datos maliciosos, como etiquetas HTML dentro de la cadena, debe ignorarse por completo. Intentar manipularlo aquí lo llevará a dolores de cabeza mientras trata de "des-manipularlo" más tarde después de sacarlo de la base de datos. Los malos "datos web" no pueden dañar su base de datos.

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.
  • usa el modificador 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

+1 por solo desinfectar cuando sea necesario. Por supuesto, desinfectar para SQL es * evil *, solo use consultas parametrizadas ... – sleske

+0

@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

+0

¿Qué quiere decir "consultas parametrizadas"? – aslum

1

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.

0

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?

+0

Sin embargo, ¿una URL de imagen no debería tener símbolos y símbolos? – aslum

+0

¿Por qué no? Un script es una fuente de imágenes perfectamente válida. –

+2

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. –

Cuestiones relacionadas