2009-03-18 15 views
34

¿Es filter_var bueno para el filtrado de datos? ¿Qué tipo de datos malos filtrará? Sí uso mysql_real_escape_string pero me pregunto si agregar filter_var ayudará?¿Filter_var es una buena forma de hacerlo?

+1

No estoy seguro de por qué esto fue desestimado – Ross

+2

Debería intentar comprender qué son las inyecciones XSS y SQL y por qué son posibles en lugar de pedir una función milagrosa para evitarlas. – Gumbo

+2

¿Ayudará qué? ¿Qué estás tratando de hacer que esperas que filter_var logre? – jmucchiello

Respuesta

23

Para defenderse de la inyección SQL, use declaraciones preparadas si es posible. Si no, use mysql_real_escape_string para strings, (int) casting o intval() para enteros, (float) o floatval() para floats y addcslashes ($ input, '% _') para cadenas que se usarán dentro de sentencias LIKE. Las cosas se complican aún más cuando intentamos escapar de las cadenas que se usarán dentro de las instrucciones RLIKE.

Para filtrar el contenido HTML, lo mejor sería strip_tags (sin pasar $ allowable_tags), pero ... no le guste/quiere, en cuyo caso la solución es más asequible:

$escaped = htmlspecialchars($input, ENT_QUOTES, $your_charset); 

Un una solución más confiable sería usar una biblioteca como HTML Purifier

Las funciones del filtro son correctas, pero algunas de ellas son más validadoras que filtros. Dependiendo de sus necesidades, puede encontrar algunos de ellos útiles.

+4

htmlspecialchars() es lo correcto para enviar texto a HTML. strip_tags() perdería contenido si quisiera usar el carácter legítimo '<' en el texto, y no mostraría '&' correctamente. – bobince

1

Realmente depende de lo que estás tratando de hacer, realmente no puedo responder sin conocer detalles. Los filtros posibles y sus efectos se enumeran aquí: Types of filters

+0

Básicamente para filtrar y validar cualquier exploits xss o mysql provenientes de la entrada del usuario. – mikelbring

+0

Hay muchas formas (http://ha.ckers.org/xss.html) de inyecciones de XSS y SQL. Depende de su aplicación cómo procesó los datos del usuario. – Gumbo

17

Ajuste filter_var utilizándolo con FILTER_* constants. Parece que está buscando sanitisation de datos (en realidad ajustando los datos para hacerlo seguro *) en lugar de validation (verificando que los datos estén seguros).

Diferentes filtros pueden ayudar con diferentes tareas. Mientras que mysql_real_escape_string está bien para desinfectar los datos para evitar la inyección de SQL, no sirve para generar datos que puedan contener HTML. He aquí un par de filtros de que haría uso para las tareas diarias:

  • FILTER_SANITIZE_SPECIAL_CHARS - útil para la visualización (no eliminar) el código HTML, la prevención de ataques XSS y la conversión de los símbolos a entidades HTML.
  • FILTER_SANITIZE_STRING con las banderas STRIP_LOW/HIGH - en realidad elimina HTML (ver strip_tags).
  • FILTER_SANITIZE_URL - hace que las URL sean seguras *.
  • FILTER_SANITIZE_EMAIL - hace las direcciones de correo electrónico seguras, aunque preferiría usar su primo de validación antes de almacenar la dirección.

* Yo uso seguro sin apretar, soy de la opinión de que nunca se puede estar demasiado seguro.

-5

Basándome en algunas pruebas menores, he llegado a la conclusión de que las constantes de filter_var no son confiables.

Por ejemplo:

filter_var('[email protected]', FILTER_VALIDATE_EMAIL); // valid 
filter_var('http://.', FILTER_VALIDATE_URL); // valid 
filter_var('[email protected]', FILTER_SANITIZE_EMAIL); // [email protected] 
filter_var('http://.', FILTER_SANITIZE_URL); // http://. 

Estos son claramente valores no válidos, pero pase filter_var 's constantes. No confíes en filter_var.

+4

Sanitizar no es lo mismo que validar. –

+0

@Mathew, tiene razón, pero no estoy seguro de qué tiene que ver eso con los problemas con 'filter_var' que señalé. No filtrará correctamente ni desinfectará correctamente las entradas que proporcioné. – eyelidlessness

+13

Por lo que puedo ver en http://tools.ietf.org/html/rfc822, la dirección de correo electrónico está formulada correctamente. En particular, 'c' podría registrarse como un nuevo TLD, y' b-'un dominio allí (' -' es un carácter válido). No veo problemas allí. ¿No es '! Def! Xyz% abc + tag @ [127.0.0.1]' una dirección válida? (Te ahorraré que te lo preguntes, lo es) No encontré rápidamente ningún ejemplo del nombre de dominio, aunque puedo decirte que 'dig .' da una respuesta razonable, y' stackoverflow.com' devuelve la misma ip que 'stackoverflow.com' (sí, punto final en la primera url). Estoy de acuerdo con 'filter_var' y PHP en esto. – Iiridayn

2

Todo depende de lo que signifique una url válida o un correo electrónico válido.

Por ejemplo [email protected] - bien, podría filtrar dominios de nivel superior para excluir .c pero la lista de dominios de nivel superior no es constante. Además, todos los personajes son válidos. Aunque parece raro y casi seguro que no es válido, muchos filtros regex lo validarán también.

Con el correo electrónico [email protected] o la url http://. si se muestran o utilizan en los enlaces, no harán ningún daño, incluso si no van a ninguna parte.

Creo que parte del problema es la cuestión de qué tan sueltos quieres tus filtros. Si la gran preocupación es XSS o inyección SQL o si no se previene la entrada peligrosa, si el valor es útil o no puede ser irrelevante, este tipo de filtro puede ser el truco.

Si quiere asegurarse de que el valor no solo sea seguro sino que también se pueda utilizar, es una bestia más complicada.

Cuestiones relacionadas