2010-11-11 15 views
5
$str = '"[email protected]"@domanin.com'; 

filter_var($str, FILTER_VALIDATE_EMAIL);//return valid email. 

Die obige E-Mail-Adresse ist wahr ... Fair genug, dass RFC 2822 eine legale E-Mail-Adresse angibt.Macht FILTER_VALIDATE_EMAIL eine Zeichenfolge zum Einfügen in die Datenbank sicher?

meine Frage ist, wenn Sie eine E-Mail mit der oben genannten könnte eine E-Mail tragen SQL-Injektionen, die die db schädigen können, obwohl Sie es mit filter_var gefiltert haben?

+2

Ich habe den Titel leicht geändert, damit er für zukünftige Generationen besser auffindbar ist. –

+0

Danke ich war zu 99% sicher, dass es nicht sicher für SQL ist wie es ist. Aber immer noch 1% ist ein großes Risiko. – Val

Antwort

4

meine Frage ist, wenn Sie eine E-Mail mit der oben genannten könnte eine E-Mail tragen SQL-Injektionen, die die db schädigen können, obwohl Sie es mit filter_var gefiltert haben?

filter_var ist nicht Ersatz für Datenbank spezifische sanitäre Einrichtungen wie mysql_real_escape_string()! Das muss man immer auch anwenden.

+0

Gibt es Beispiele für XSS oder SQL Injection, die als gültige E-Mail-Adresse unter diesem Filter validiert werden? (Aus akademischer Neugier heraus; es gibt offensichtlich keinen Grund, mysql_real_escape_string() 'oder eine ähnliche Escapefunktion nicht zu verwenden.). – Yahel

+0

"1=1"@domain.com könnte einer sein. Aber nicht zu sicher. – Val

+1

@yc Gute Frage! Ich kann mir keinen Kopf von oben vorstellen, aber die Gefahr ist groß, dass es mit einer cleveren Kombination möglich ist. –

2

Ja - verlassen Sie sich auf nichts außer dem datenbankspezifischen Escapemechanismus für die Sicherheit vor der SQL-Injektion.

Verwenden Sie immer mysql_real_escape_string() darauf, bevor Sie es in SQL verwenden.

1

Auch ist es sowieso nicht sicher. _VALIDATE_EMAIL erlaubt einfache Anführungszeichen ' und das Backtick ` drin. (Auf Bereinigungsfunktionen sollte jedoch nie Verlass sein. Context Escape oder parametrisiertes SQL verwenden.)

1

Ich verwende FILTER_VALIDATE_EMAIL, um zu prüfen, ob die E-Mail gültig ist und weiter unten, wenn die E-Mail in einem gespeichert werden soll Datenbank würde ich dann die gefährlichen Zeichen ausziehen. Die mysql und mysqli Bibliotheken sind auch ziemlich tot im Wasser, also würde ich vorschlagen, PDO zu verwenden, was eine viel sicherere Option ist.

http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers

Auch unter dem Link darauf hin, welche Zeichen der geltenden Rechtslage in einer E-Mail-Adresse, und Backticks Apostrophe sind in E-Mail-Adresse erlaubt, daher wahrscheinlich, warum FILTER_VALIDATE_EMAIL sie nicht abholen ... erinnern wir sind Suche nach ungültigen E-Mail-Adressen nicht gefährliche E-Mail-Adressen.

Wie bei jeder Programmiersprache sollten Sie die Sicherheit immer ganz oben auf der Liste behalten!

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

0

nie VALIDATE verwenden, vielleicht können Sie SANITILIZE verwenden, aber ich es sowieso nicht empfehlen.


Betrachten Sie diesen Code:

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

Die grundlegende SQL-Injection " or 1 = 1 ist, haben Sie schon davon gehört. Aber wir können ESpaces nicht verwenden und wir müssen diese Zeichenfolge mit etwas wie @something.com beenden.

Also, wir beginnen mit " und fügen hinzu or'1'='1' das wird funktionieren (weil or1=1 wird fehlschlagen). Jetzt brauchen wir das @email.com, fügen wir es als MySQL-Kommentar hinzu ([email protected]).Also, das ist das Ergebnis:

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

Test it.

Dies gilt E-Mail für filter_var und unsicher für mysqli_query.

Verwandte Themen