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 等价物 [重复]