FILTER_VALIDATE_EMAIL 是不是使字符串可以安全地插入数据库?

Posted

技术标签:

【中文标题】FILTER_VALIDATE_EMAIL 是不是使字符串可以安全地插入数据库?【英文标题】:Does FILTER_VALIDATE_EMAIL make a string safe for insertion in database?FILTER_VALIDATE_EMAIL 是否使字符串可以安全地插入数据库? 【发布时间】:2011-05-08 11:15:01 【问题描述】:
$str = '"mynam@blabl"@domanin.com';

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

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

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

【问题讨论】:

我稍微更改了标题,以便后代更好地找到它 谢谢,我 99% 确信它对 sql 来说是不安全的。但是 1% 仍然是一个很大的风险。 【参考方案1】:

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


考虑这段代码:

$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

Test it.

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

【讨论】:

【参考方案2】:

我倾向于使用 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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

而且,无论如何它也不安全。 _VALIDATE_EMAIL 允许单引号 ' 和其中的反引号 `。 (但永远不应该依赖清理函数,总是上下文转义或使用参数化 SQL。)

【讨论】:

【参考方案5】:

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

filter_var不是替代像 mysql_real_escape_string() 这样的数据库特定卫生设施!人们也需要始终应用这一点。

【讨论】:

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

以上是关于FILTER_VALIDATE_EMAIL 是不是使字符串可以安全地插入数据库?的主要内容,如果未能解决你的问题,请参考以下文章

PHP FILTER_VALIDATE_EMAIL 无法正常工作

什么是 php FILTER_VALIDATE_EMAIL 的 Jquery 等价物 [重复]

PHP 的 filter_var FILTER_VALIDATE_EMAIL 真的有效吗?

php有多少个内置函数

phpDOC

验证电子邮件地址