¿Son válidas esas direcciones de correo electrónico?
Sí, lo son. Consulte por ejemplo aquí o con un poco más de explicación aquí .
Para obtener una explicación detallada sobre el aspecto de los correos electrónicos, consulte la información RFC3696 . Los RFC más técnicos también están vinculados allí.
Ataques posibles en la parte local de una dirección de correo electrónico
Sin comillas, las partes locales pueden consistir en cualquier combinación de
Caracteres alfabéticos, dígitos o cualquiera de los caracteres especiales
! # $ % & ' * + - / = ? ^ _ ' . { | } ~
período (".") también puede aparecer, pero no puede usarse para comenzar o terminar
La parte local, ni pueden aparecer dos o más periodos consecutivos.
Dicho de otra manera, cualquier carácter ASCII gráfico (impresión) otro
que el signo de at ("@"), barra invertida, comillas dobles, comas o cuadrados
Los corchetes pueden aparecer sin citar. Si alguno de esa lista de
Los caracteres excluidos deben aparecer, deben estar entre comillas.
Entonces, la regla es más o menos: la mayoría de los caracteres pueden ser parte de la parte local, excepto por @\",[]
, estos deben estar entre "
(excepto por supuesto "
en sí mismo, que debe ser evitado) cuando en una cadena entre comillas).
También hay reglas sobre dónde y cuándo citar y cómo manejar los comentarios, pero eso es menos relevante para su pregunta.
El punto aquí es que muchos ataques pueden ser parte de la parte local de una dirección de correo electrónico, por ejemplo:
-
'/**/OR/**/1=1/**/--/**/@a.a
-
"<script>alert(1)</script>"@example.com
-
" onmouseover=alert(1) foo="@example.com
-
"../../../../../test%00"@example.com
- ...
Ataques posibles en la parte del dominio de una dirección de correo electrónico
La estructura exacta de la parte del dominio se puede ver en RFC2822 o RFC5322 :
addr-spec = local-part "@" domain
local-part = dot-atom / quoted-string / obs-local-part
domain = dot-atom / domain-literal / obs-domain
domain-literal = [CFWS] "[" *([FWS] dcontent) [FWS] "]" [CFWS]
dcontent = dtext / quoted-pair
dtext = NO-WS-CTL / ; Non white space controls
%d33-90 / ; The rest of the US-ASCII
%d94-126 ; characters not including "[",
; "]", or "\"
Donde:
dtext = %d33-90 / ; Printable US-ASCII
%d94-126 / ; characters not including
obs-dtext ; "[", "]", or "\"
Puede ver que, una vez más, la mayoría de los caracteres están permitidos (incluso caracteres no ascii ). Los posibles ataques serían:
-
[email protected]&a=////etc/passwd
-
foo@bar(<script>alert(1)</script>).com
-
foo@'/**/OR/**/1=1/**/--/**/
Conclusión
No puedes validar las direcciones de correo electrónico de forma segura.
En su lugar, debe asegurarse de tener las defensas adecuadas en su lugar (codificación HTML para XSS, declaraciones preparadas para inyección SQL, etc.).
Como defensa en profundidad, podría prohibir cadenas y comentarios entre comillas para obtener cierta protección, ya que estas dos cosas permiten los caracteres y cadenas más inusuales. Pero algunos ataques siguen siendo posibles, y excluirás a una pequeña cantidad de usuarios.
Si necesita un filtro de entrada adicional que exceda los límites del formato de correo electrónico, ya que no confía en el resto de su aplicación, debe considerar cuidadosamente lo que permite y lo que no permite. Por ejemplo, gmail utiliza +
para permitir el filtrado de correos electrónicos entrantes, por lo que no permitir que los usuarios no puedan registrarse. Otros proveedores pueden utilizar otros caracteres para funcionalidades similares. Un primer enfoque podría ser permitir solo alfanum + ! # % * + - = ? ^ _ . | ~
. Esto no permitiría < > ' " ' / $ { } &
, que son caracteres utilizados en ataques comunes. Dependiendo de su aplicación, es posible que desee no permitir más caracteres.
Y como mencionó RFC822 : está un poco desactualizado (es de 1982), pero incluso permite cadenas y comentarios entre comillas, por lo que solo decir que solo acepta las direcciones compatibles con RFC822 no solo no sería práctico, sino que tampoco funcionaría.
Además, ¿está revisando sus correos electrónicos del lado del cliente? El código JS da esa impresión. Un atacante podría simplemente pasar por alto las verificaciones del lado del cliente.