FILTER_VALIDATE_EMAIL是否可以安全地插入数据库中的字符串?

时间:2010-11-11 13:06:35

标签: php validation email filter-var

$str = '"mynam@blabl"@domanin.com';

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

上面的电子邮件返回true ...足够公平,RFC 2822说这是一个合法的电子邮件地址。

我的问题是,如果您使用上述方法验证电子邮件,即使您使用filter_var对其进行过滤,电子邮件也会进行可能损害数据库的SQL注入?

5 个答案:

答案 0 :(得分:4)

  

我的问题是,如果您使用上述方法验证电子邮件,即使您使用filter_var对其进行过滤,电子邮件也会进行可能损害数据库的SQL注入?

filter_var mysql_real_escape_string()等数据库特定卫生设施的替代品!人们也需要始终应用它。

答案 1 :(得分:2)

是 - 除了数据库特定的转义机制之外,不要依赖SQL注入的安全性。

在SQL中使用它之前,请始终使用mysql_real_escape_string()

答案 2 :(得分:1)

另外,它还不安全。 _VALIDATE_EMAIL允许使用单引号'和反引号`。 (但是永远不应该依赖清理函数,总是上下文转义或使用参数化SQL。)

答案 3 :(得分:1)

我倾向于使用FILTER_VALIDATE_EMAIL来检查电子邮件是否有效,如果电子邮件需要保存到数据库中,那么我会更进一步,我会删除危险的字符。 mysql和mysqli库在水中也已经死了,所以我建议使用PDO,这是一个更安全的选择。

http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers

此外,下面的链接告知电子邮件地址中哪些字符合法,电子邮件地址中允许使用反引号和单引号,因此可能为什么FILTER_VALIDATE_EMAIL不会选择它们...请记住我们正在查找无效的电子邮件地址危险的电子邮件地址。

就像任何编程语言一样,你应该始终将安全性放在列表的顶部!

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

答案 4 :(得分:0)

永远不要使用VALIDATE,也许你可以使用SANITILIZE,但无论如何我都不推荐它。

考虑以下代码:

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

基本的SQL注入是" or 1 = 1,您已经听说过它。但是我们不能使用espaces,我们需要用@something.com之类的东西来结束这个字符串。

因此,我们从"开始并添加or'1'='1'这将起作用(因为or1=1将失败)。现在我们需要@email.com,让我们将它添加为MySQL注释(--@something.com)。所以,这就是结果:

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

Test it.

这是filter_var的有效电子邮件,mysqli_query不安全。