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

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

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

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

4

5 回答 5

5

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

filter_var不是数据库特定卫生的替代品,例如mysql_real_escape_string()!人们也需要始终应用这一点。

于 2010-11-11T13:10:44.007 回答
2

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

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

于 2010-11-11T13:11:02.120 回答
1

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

于 2010-11-11T13:35:08.280 回答
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

于 2013-01-16T00:50:51.577 回答
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

测试一下。

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

于 2017-08-06T19:49:49.523 回答