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 banderasSTRIP_LOW/HIGH
- en realidad elimina HTML (verstrip_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
.