texto sanear saneamiento filtros filter_var filter_sanitize_string filter_sanitize_number_int filter_flag_strip_low ejemplo php security

php - sanear - ¿Filter_var es una buena forma de hacerlo?



sanear texto php (5)

Para defenderse de la inyección de 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 contenido HTML, lo mejor sería strip_tags (sin pasar $ allowable_tags), pero ... es posible que no le guste / quiera, en cuyo caso la solución más asequible es:

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

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

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

¿ filter_var es bueno para filtrar datos? ¿Qué tipo de datos malos filtrará? Sí uso mysql_real_escape_string pero me pregunto si agregar filter_var ayudará?


Realmente depende de lo que trates de hacer, realmente no puedo responder sin conocer detalles. Los posibles filtros y sus efectos se enumeran a continuación: Tipos de filtros


Todo depende de lo que quiera decir con una URL válida o un correo electrónico válido.

Por ejemplo [email protected] - bueno, 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 url http://. si se muestran o utilizan en enlaces, no causará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 la inyección de XSS o SQL o de otra manera prevenir entradas peligrosas, ya sea que el valor sea utilizable 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.


Usted ajusta filter_var usándolo con las constantes FILTER_* . Parece que está buscando la sanitisation de los datos (en realidad ajustando los datos para que sea seguro *) en lugar de la validation (verificando que los datos estén seguros).

Diferentes filtros pueden ayudar con diferentes tareas. Si bien 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. Aquí hay un par de filtros que usaría para las tareas cotidianas:

  • FILTER_SANITIZE_SPECIAL_CHARS - útil para mostrar (no eliminar) código HTML, prevenir ataques XSS y convertir 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.

* Uso de forma segura, soy de la opinión de que nunca puedes estar tan seguro.


filter_var en algunas pruebas menores, llegué 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 valores claramente inválidos, pero pasan las constantes de filter_var . No confíes en filter_var .