$str = '"mynam@blabl"@domanin.com';
filter_var($str, FILTER_VALIDATE_EMAIL);//return valid email.
上述电子邮件返回true... RFC 2822说这是一个合法的电子邮件地址,这没问题。
我的问题是,如果您使用上述方法验证电子邮件,那么即使您使用filter_var过滤了它,电子邮件是否可能携带SQL注入,从而损坏数据库?
$str = '"mynam@blabl"@domanin.com';
filter_var($str, FILTER_VALIDATE_EMAIL);//return valid email.
上述电子邮件返回true... RFC 2822说这是一个合法的电子邮件地址,这没问题。
我的问题是,如果您使用上述方法验证电子邮件,那么即使您使用filter_var过滤了它,电子邮件是否可能携带SQL注入,从而损坏数据库?
mysql_real_escape_string()
或类似的转义函数。) - Yahel是的 - 除了数据库特定的转义机制,不要依赖任何东西来防止SQL注入。
在将其用于SQL之前,始终对其使用 mysql_real_escape_string()
进行转义。
我倾向于使用FILTER_VALIDATE_EMAIL来检查电子邮件是否有效,然后在稍后将电子邮件保存到数据库中时,我会剥离危险字符。 mysql和mysqli库也几乎已经过时了,因此我建议使用PDO,这是一个更安全的选项。
http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers
此外,下面的链接提供了电子邮件地址中允许使用哪些字符的建议。在电子邮件地址中允许使用反引号和单引号,这可能是 FILTER_VALIDATE_EMAIL 无法识别它们的原因...请记住,我们正在寻找无效的电子邮件地址,而不是危险的电子邮件地址。
就像任何编程语言一样,当涉及到任何编程语言时,您应始终将安全性置于首位!
'
和反引号 `。(但应该永远不要依赖清理函数,而是始终进行上下文转义或使用参数化 SQL。)不要使用 VALIDATE
,也许你可以使用 SANITIZE
,但我仍然不建议。
Consider this code:
$email = filter_var($_GET['email'], FILTER_VALIDATE_EMAIL);
$query = mysqli_query($sql, 'SELECT * FROM table WHERE email = "'.$email.'"');
" or 1 = 1
,你可能已经听说过了。但我们不能使用转义符号,我们需要以@something.com
结尾这个字符串。
所以,我们从"
开始,添加or'1'='1'
就可以了(因为or1=1
会失败)。现在我们需要@email.com
,让我们将它作为MySQL注释添加(--@something.com
)。所以,这就是结果:
"or'1'='1'--"@email.com
这是一个对于filter_var
有效,但不安全的用于mysqli_query
的电子邮件。