$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 注入?
我的问题是,如果您使用上述方法验证电子邮件,即使您已使用 filter_var 对其进行过滤,电子邮件是否会携带可能损害数据库的 sql 注入?
filter_var
不是数据库特定卫生的替代品,例如mysql_real_escape_string()
!人们也需要始终应用这一点。
是的 - 除了数据库特定的转义机制之外,不要依赖任何东西来确保 SQL 注入的安全。
mysql_real_escape_string()
在 SQL 中使用它之前,请始终使用它。
而且,反正也不安全。_VALIDATE_EMAIL 允许在其中使用单引号'
和反引号`。(但永远不应该依赖清理函数,总是上下文转义或使用参数化 SQL。)
我倾向于使用 FILTER_VALIDATE_EMAIL 来检查电子邮件是否有效,然后如果需要将电子邮件保存到数据库中,我会进一步删除危险字符。mysql 和 mysqli 库也几乎死气沉沉,所以我建议使用 PDO,这是一个更安全的选择。
http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers
此外,下面的链接建议电子邮件地址中哪些字符是合法的,电子邮件地址中允许使用反引号和单引号,因此可能是 FILTER_VALIDATE_EMAIL 不接收它们的原因......请记住,我们正在寻找无效的电子邮件地址而不是危险的电子邮件地址.
就像涉及任何编程语言的任何事情一样,您应该始终将安全性放在首位!
永远不要使用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
。