¿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?
Respuesta
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.
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
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
Básicamente para filtrar y validar cualquier exploits xss o mysql provenientes de la entrada del usuario. – mikelbring
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
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 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.
* Yo uso seguro sin apretar, soy de la opinión de que nunca se puede estar demasiado seguro.
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
.
Sanitizar no es lo mismo que validar. –
@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
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
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.
- 1. ¿Cuál es una buena forma de implementar una aplicación Perl?
- 2. "Extender" la tabla de "cadena": ¿cómo hacerlo? ¿Es incluso una buena idea?
- 3. Verificación de contraseña; ¿Es esta forma de hacerlo seguro?
- 4. ¿Cuál es una forma correcta y buena de implementar __hash __()?
- 5. ¿Debo I Unit Test Data Layer Access? ¿Es esta una buena práctica y cómo hacerlo?
- 6. Inverse String.Replace - ¿Forma más rápida de hacerlo?
- 7. ¿Una buena forma de redireccionar con una solicitud POST?
- 8. Zend_Validate_EmailAddress versus filter_var (..., FILTER_VALIDATE_EMAIL)
- 9. ¿Cuál es una buena forma de ejecutar Javascript de forma interactiva?
- 10. filter_var php pregunta
- 11. filter_var usando FILTER_VALIDATE_REGEXP
- 12. ¿Una buena forma de convertir entre short y bytes?
- 13. ¿Cuál es una buena forma de crear un IObservable para un método?
- 14. JSF: Autenticación y autorización, la mejor forma de hacerlo
- 15. ¿Es una buena forma de iniciar una matriz de objetos de JavaScript y sus propiedades?
- 16. ¿Cuál es una buena forma de implementar JavaScript por página en Rails?
- 17. ¿Cuál es una buena forma de desnormalizar una base de datos mysql?
- 18. MongoDB: ¿Cuál es una buena forma de obtener una lista de todas las etiquetas únicas?
- 19. ¿Cuál es una buena forma de recorrer líneas en una cadena de varias líneas?
- 20. ¿cuál es una buena forma de obtener el tamaño del archivo?
- 21. ¿Cuál es una forma de "buena práctica" para escribir una aplicación Python GTK +?
- 22. Buffering doble para objetos de juego, ¿qué es una buena forma genérica y limpia de C++?
- 23. SQL: ¿Es correcta una consulta como esta o hay una forma más eficiente de hacerlo, como usar una combinación?
- 24. Programando en contra de una enumeración en una declaración de cambio, ¿es esta tu forma de hacerlo?
- 25. ¿Funciona realmente el filter_var FILTER_VALIDATE_EMAIL de PHP?
- 26. php error de correo electrónico filter_var
- 27. Una buena forma de precargar el ensamblado .NET
- 28. PHP Mime revisando el tipo de forma alternativa de hacerlo?
- 29. ¿Una buena forma de cortar un vector flotante?
- 30. Una buena forma de insertar una cadena antes de una coincidencia de expresiones regulares en Ruby
No estoy seguro de por qué esto fue desestimado – Ross
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
¿Ayudará qué? ¿Qué estás tratando de hacer que esperas que filter_var logre? – jmucchiello