2012-05-03 36 views
11

Tengo una página en la que quiero aceptar una dirección de correo electrónico en los parámetros GET. Si utilizo FILTER_VALIDATE_EMAIL, ¿sigo siendo vulnerable a los ataques de inyección de xss y javascript, y cosas por el estilo?¿El FILTER_VALIDATE_EMAIL de PHP proporciona la seguridad adecuada?

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

Respuesta

9

Sí, una dirección válida de correo electrónico se puede utilizar como contenedor de algunas cadenas cuidadosamente diseñadas.

salir de la mentalidad de "filtrado" y entrar en la mentalidad de "escapar". Un filtro universal "hazlo seguro" simplemente no existe.

por ejemplo, si la dirección de correo electrónico se enviará a un documento de texto plano, entonces no se necesita hacer nada. si se envía a un documento html, como un nodo de texto, debe escaparse para caracteres especiales y entidades html. si se está colocando en un documento html, y su valor estará dentro de un atributo html, entonces se deberá realizar un escapado muy cuidadoso, y esto dependerá del contexto. si se está utilizando en una consulta sql, debe escaparse a través de la función de escape específica de la base de datos. y así.

es todo sobre el contexto de uso, no el contenido de la cadena. esto sirve para todo (no solo correos electrónicos u otras aportaciones de los usuarios), y no es solo una cuestión de seguridad, sino que es una cuestión de programación correcta.

fyi, recuerdo la especificación de la dirección de correo electrónico que permite cadenas entrecomilladas, por lo que algo como "<script>alert('xss')</script>"@example.com sería válido. las posibilidades son obvias.

+1

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

+1

+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 * sí * bloqueó las cotizaciones o menos que, entonces solo sería por co-incidencia y no sería algo en lo que nunca debería confiar. – bobince

2

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

+5

Nada que ver con los errores. 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 causará dolor si solo lo inserta en una consulta SQL ... – Cylindric

Cuestiones relacionadas