Are those email addresses valid?
Sì, lo sono. Vedi ad esempio qui o con qualche spiegazione in più here .
Per una buona spiegazione su come possono apparire le email, consulta l'informativa RFC3696 . Anche le RFC più tecniche sono collegate qui.
Attacchi possibili nella parte locale di un indirizzo email
Without quotes, local-parts may consist of any combination of
alphabetic characters, digits, or any of the special characters
! # $ % & ' * + - / = ? ^ _ ' . { | } ~
period (".") may also appear, but may not be used to start or end
the local part, nor may two or more consecutive periods appear.
Stated differently, any ASCII graphic (printing) character other
than the at-sign ("@"), backslash, double quote, comma, or square
brackets may appear without quoting. If any of that list of
excluded characters are to appear, they must be quoted.
Quindi la regola è più o meno: la maggior parte dei caratteri può essere parte della parte locale, ad eccezione di @\",[]
, quelli devono essere compresi tra "
(tranne ovviamente "
stesso, che deve essere sfuggito quando in una stringa quotata).
Ci sono anche regole su dove e quando quotare e come gestire i commenti, ma questo è meno rilevante per la tua domanda.
Il punto qui è che molti attacchi possono far parte della parte locale di un indirizzo email, ad esempio:
-
'/**/OR/**/1=1/**/--/**/@a.a
-
"<script>alert(1)</script>"@example.com
-
" onmouseover=alert(1) foo="@example.com
-
"../../../../../test%00"@example.com
- ...
Attacchi possibili nella parte del dominio di un indirizzo email
La struttura esatta della parte del dominio può essere vista in 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 "\"
Dove:
dtext = %d33-90 / ; Printable US-ASCII
%d94-126 / ; characters not including
obs-dtext ; "[", "]", or "\"
Puoi vederlo di nuovo, la maggior parte dei caratteri è consentita (anche caratteri non ascii ). Possibili attacchi sarebbero:
-
[email protected]&a=////etc/passwd
-
foo@bar(<script>alert(1)</script>).com
-
foo@'/**/OR/**/1=1/**/--/**/
Conclusione
Non puoi convalidare gli indirizzi email in modo sicuro.
Invece, è necessario assicurarsi di avere delle difese adeguate (codifica HTML per XSS, istruzioni preparate per l'iniezione SQL, ecc.)
Come difesa in profondità, puoi proibire le stringhe e i commenti citati per ottenere una certa quantità di protezione, in quanto queste due cose consentono i caratteri e la stringa più insoliti. Ma alcuni attacchi sono ancora possibili e escluderai una piccola quantità di utenti.
Se hai bisogno di filtri di input aggiuntivi che superino i limiti del formato email, perché non ti fidi del resto della tua applicazione, dovresti considerare attentamente cosa autorizzi e cosa non permetti. Ad esempio, +
viene utilizzato da Gmail per consentire il filtraggio dei messaggi di posta in arrivo, quindi non consentire agli utenti di non registrarsi. Altri caratteri possono essere utilizzati da altri provider per funzionalità simili. Un primo approccio potrebbe essere quello di consentire solo alfanum + ! # % * + - = ? ^ _ . | ~
. Ciò non consentirebbe < > ' " ' / $ { } &
, che sono caratteri usati negli attacchi comuni. A seconda della tua applicazione, potresti voler disabilitare altri caratteri.
E come hai detto RFC822 : è un po 'obsoleto (è del 1982), ma anche consente stringhe e commenti tra virgolette, quindi è sufficiente dire che accetti solo gli indirizzi conformi a RFC822 non solo non sarà pratico, ma non funzionerà.
Inoltre, stai controllando le tue e-mail lato client? Il codice JS dà quell'impressione. Un utente malintenzionato potrebbe ignorare i controlli sul lato client.