¿El FILTER_VALIDATE_EMAIL de PHP proporciona seguridad adecuada?

Tengo una página en la que quiero aceptar una dirección de correo electrónico en los parámetros GET. si uso FILTER_VALIDATE_EMAIL, ¿sigo siendo vulnerable a los ataques de inyección xss y javascript, y similares?

No estoy preguntando si es un validador de direcciones de correo electrónico bueno o lo suficientemente bueno. Quiero saber si todavía se puede inyectar un código web incorrecto a través de cadenas arbitrarias que se pasan a través de él. ¿Necesito hacer un filtrado adicional para evitar eso?

preguntado el 03 de mayo de 12 a las 15:05

2 Respuestas

Sí, una dirección de correo electrónico válida puede aun ser utilizado como contenedor para algunas cuerdas cuidadosamente elaboradas que pueden usarse para atacarte.

Sal de la mentalidad de "filtrar" y adopta la mentalidad de "escapar". Un filtro universal de "hacerlo seguro" simplemente no existe. No puede existir, porque todos los escapes deben hacerse de una manera específica al contexto.

Por ejemplo, si la dirección de correo electrónico se imprimirá en un documento de texto sin formato, entonces no es necesario hacer nada. Si se está enviando a un documento html, como un nodo de texto, entonces debe escaparse para un contexto html, por lo tanto, escape los caracteres especiales y las entidades html. Si se está colocando en un documento html, y su valor estará dentro de un atributo html, entonces sería necesario realizar un escape muy, muy cuidadoso, y dependería de que atributo HTML. Si se está utilizando en una consulta sql, entonces debe escaparse a través de una función de escape específica de la base de datos, e incluso entonces debe escapar de manera diferente si lo está usando como un valor de parámetro (es decir, where someColumn = '$paramVal'), frente a un nombre de símbolo como un nombre de tabla, un nombre de columna (es decir, order by $myEscapedColumnName DESC). y así.

Se trata del contexto de uso, no del contenido de la cadena. Esto se aplica a todo (no solo a los correos electrónicos u otras entradas del usuario), y no es solo una cuestión de seguridad, sino también una cuestión de programación y corrección de la sintaxis. El escape adecuado es complicado y requiere mucho tiempo para aprender, y una cuidadosa reflexión y consideración al codificar. Muchos codificadores no se molestan en hacerlo debido al esfuerzo, y son ellos los que hacen que la empresa sea pirateada.

Para tu información, la especificación de la dirección de correo electrónico permite cadenas entre comillas, por lo que podrías inyectar cadenas como "<script>alert('xss')</script>"@example.com. Las posibilidades son obvias.

Respondido el 24 de diciembre de 19 a las 23:12

Por ejemplo, tampoco existe un saludo universalmente "seguro". Lo que es cortés en algunas sociedades es grosero en otras. ¡Conoce tu contexto! - xeoncross

+1. FILTER_VALIDATE_EMAIL es para verificar si las direcciones de correo electrónico son válidas y, como muestra el ejemplo anterior, eso no tiene nada que ver con ningún otro problema de inyección. Si se sí logró comillas en bloque o menos que, entonces solo sería por coincidencia y no sería algo en lo que deba confiar. - bobince

Eso debería ser lo suficientemente bueno, pero, naturalmente, aún debe evitarlo al ingresarlo en una base de datos, etc. Nunca se sabe qué tipo de error puede existir en PHP o Apache, etc., que puede permitir que ocurra un ataque de todos modos.

contestado el 03 de mayo de 12 a las 15:05

Nada que ver con los bichos. Las direcciones de correo electrónico válidas no son automáticamente seguras para la base de datos. El correo electrónico john.o'connor@somewhere.com le dará pena si solo inyecta eso en una consulta SQL ... - Cilíndrico

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.