FILTER_VALIDATE_EMAIL能使字符串安全地插入数据库吗?

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

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

上述电子邮件返回true... RFC 2822说这是一个合法的电子邮件地址,这没问题。

我的问题是,如果您使用上述方法验证电子邮件,那么即使您使用filter_var过滤了它,电子邮件是否可能携带SQL注入,从而损坏数据库?


2
我稍微修改了标题,以便更好地为未来的世代找到。 - Pekka
谢谢,我99%确定它不安全,但是1%仍然是巨大的风险。 - Val
5个回答

5
我的问题是,如果您使用上面的方法验证电子邮件,即使您使用filter_var过滤它,是否可以携带SQL注入的电子邮件仍然会损坏数据库? filter_var不是数据库特定卫生处理(例如mysql_real_escape_string())的替代品! 也需要始终应用该处理。

有没有 XSS 或 SQL 注入的例子,可以在该过滤器下验证为有效的电子邮件地址?(出于学术好奇心而问;显然没有理由不使用 mysql_real_escape_string() 或类似的转义函数。) - Yahel
"1=1"@domain.com 可能是一个,但不太确定。 - Val
1
@yc 很好的问题!我一时想不起来有什么,但危险性很大,可能会使用一些巧妙的组合。 - Pekka

2

是的 - 除了数据库特定的转义机制,不要依赖任何东西来防止SQL注入。

在将其用于SQL之前,始终对其使用 mysql_real_escape_string() 进行转义。


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


1
另外,这种做法也不安全。_VALIDATE_EMAIL 允许在其中使用单引号 ' 和反引号 `。(但应该永远不要依赖清理函数,而是始终进行上下文转义或使用参数化 SQL。)

1

不要使用 VALIDATE,也许你可以使用 SANITIZE,但我仍然不建议。


Consider this code:

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

基本的SQL注入是" or 1 = 1,你可能已经听说过了。但我们不能使用转义符号,我们需要以@something.com结尾这个字符串。

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

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

测试一下。

这是一个对于filter_var有效,但不安全的用于mysqli_query的电子邮件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接