FILTER_VALIDATE_EMAIL rende una string sicura per l'inserimento nel database?

$str = '"[email protected]"@domanin.com'; filter_var($str, FILTER_VALIDATE_EMAIL);//return valid email. 

l'e-mail sopra restituisce vero … Abbastanza sufficiente che RFC 2822 dice che è un indirizzo email legale.

la mia domanda è se si validation una e-mail utilizzando quanto sopra potrebbe un'e-mail effettuare iniezioni SQL che possono danneggiare il db anche se è stato filtrato con filter_var?

la mia domanda è se si validation una e-mail utilizzando quanto sopra potrebbe un'e-mail effettuare iniezioni SQL che possono danneggiare il db anche se è stato filtrato con filter_var?

filter_var non è un sostituto per servizi igienici specifici del database come mysql_real_escape_string() ! Bisogna sempre applicare anche questo.

Sì: non fare affidamento su nulla oltre al meccanismo di escape specifico del database per la sicurezza dall'iniezione SQL.

Usa sempre mysql_real_escape_string() su di esso prima di usarlo in SQL.

Inoltre, non è sicuro comunque. _VALIDATE_EMAIL consente le virgolette singole e l'apice in esso. (Ma le funzioni di pulizia non dovrebbero mai essere invocate, sempre l'escape del context o l'uso di SQL parametrizzato).

Tendo ad utilizzare FILTER_VALIDATE_EMAIL per verificare se l'e-mail è valida e poi più avanti sulla linea se l'e-mail deve essere salvata in un database, quindi escludo i personaggi pericolosi. Le librerie mysql e mysqli sono praticamente morte nell'acqua, quindi suggerirei di usare PDO che è un'opzione molto più sicura.

http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers

Inoltre, il link sottostante indica quali caratteri sono legali in un indirizzo email, i backtick e le virgolette singole sono consentiti nell'indirizzo email, quindi probabilmente perché FILTER_VALIDATE_EMAIL non li preleva … ricorda che stiamo cercando indirizzi email non validi indirizzi email pericolosi .

Come qualsiasi cosa quando si tratta di qualsiasi linguaggio di programmazione, si dovrebbe sempre mantenere la sicurezza in cima alla list!

http://email.about.com/cs/standards/a/email_addresses.htm

Non usare mai VALIDATE , forse puoi usare SANITILIZE ma non lo consiglio comunque.


Considera questo codice:

 $email = filter_var($_GET['email'], FILTER_VALIDATE_EMAIL); $query = mysqli_query($sql, 'SELECT * FROM table WHERE email = "'.$email.'"'); 

L'SQL Injection di base è " or 1 = 1 , ne hai già sentito parlare, ma non possiamo usare espaces e dobbiamo terminare questa string con qualcosa come @something.com .

Quindi, iniziamo con " e add or'1'='1' functionrà (perché or1=1 fallirà). Ora abbiamo bisogno di @email.com , aggiungiamolo come commento MySQL ( [email protected] ). Quindi, questo è il risultato:

 "or'1'='1'--"@email.com 

Provalo.

Questa è un'e-mail valida per filter_var e non sicura per mysqli_query .