2010-11-11 62 views
5
$str = '"[email protected]"@domanin.com'; 

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

上述电子邮件返回true ...不够公平是RFC 2822说,这是一个合法的电子邮件地址。FILTER_VALIDATE_EMAIL是否可以安全地插入数据库中?

我的问题是,如果你使用上述可能的电子邮件进行SQL注入攻击,可能会损害,即使您已与filter_var过滤它的分贝验证电子邮件?

+2

我稍微改了一下标题,以便后人更好地找到它 – 2010-11-11 13:20:55

+0

Thanx我99%确定这对sql来说并不安全。但仍有1%是一个很大的风险。 – Val 2010-11-11 13:23:55

回答

4

我的问题是,如果您使用上述方法验证电子邮件,可能是电子邮件携带sql注入,可能会损害分贝,即使您使用filter_var过滤了它?

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

+0

是否有XSS或SQL注入的例子会在该过滤器下验证为有效的电子邮件地址? (为了学术上的好奇心,显然没有理由不使用'mysql_real_escape_string()'或类似的转义函数)。 – Yahel 2010-11-11 13:29:41

+0

"1=1"@domain.com可能是其中之一。但不太确定。 – Val 2010-11-11 13:34:02

+1

@yc好问题!我无法想象自己头顶上的那个,但危险是很大的,它可能使用一些聪明的组合。 – 2010-11-11 14:00:33

2

是的 - 除了数据库特定的转义机制以外,不要依赖SQL注入的安全性。

SQL中使用之前请务必使用它mysql_real_escape_string()

1

另外,反正也不安全。 _VALIDATE_EMAIL允许使用单引号'和反引号`。 (但不应该依赖清理功能,总是上下文转义或使用参数化的SQL。)

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

0

切勿使用VALIDATE,也许你可以使用SANITILIZE,但我不建议也无妨。


考虑以下代码:

$email = filter_var($_GET['email'], FILTER_VALIDATE_EMAIL); 
$query = mysqli_query($sql, 'SELECT * FROM table WHERE email = "'.$email.'"'); 

基本的SQL注入是" or 1 = 1,你已经听说过这件事。但是我们不能使用espaces,我们需要用类似于@something.com的东西来结束这个字符串。

因此,我们从"开始,并添加or'1'='1'这将工作(因为or1=1将失败)。现在我们需要@email.com,让我们将其添加为MySQL评论([email protected])。所以,这是结果:

"or'1'='1'--"@email.com 

Test it.

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

相关问题