Php 过滤验证电子邮件是否使字符串安全地插入数据库?
上面的电子邮件返回true。。。很公平,RFC2822说这是一个合法的电子邮件地址 我的问题是,如果您使用上述方法验证电子邮件,那么即使您使用filter_var对其进行了过滤,电子邮件是否会携带sql注入,从而损害数据库 我的问题是,如果您使用上述方法验证电子邮件,那么即使您使用filter_var对其进行了过滤,电子邮件是否会携带sql注入,从而损害数据库Php 过滤验证电子邮件是否使字符串安全地插入数据库?,php,validation,email,filter-var,Php,Validation,Email,Filter Var,上面的电子邮件返回true。。。很公平,RFC2822说这是一个合法的电子邮件地址 我的问题是,如果您使用上述方法验证电子邮件,那么即使您使用filter_var对其进行了过滤,电子邮件是否会携带sql注入,从而损害数据库 我的问题是,如果您使用上述方法验证电子邮件,那么即使您使用filter_var对其进行了过滤,电子邮件是否会携带sql注入,从而损害数据库 filter\u var不是mysql\u real\u escape\u string()等特定数据库的替代品!人们也需要始终应用这一
filter\u var
不是mysql\u real\u escape\u string()等特定数据库的替代品!人们也需要始终应用这一点 是-除了特定于数据库的转义机制之外,不要依赖任何其他机制来确保SQL注入的安全
在SQL中使用mysql\u real\u escape\u string()之前,请始终对其使用mysql\u real\u escape\u string()_VALIDATE_电子邮件允许使用单引号,
和反勾号`。(但永远不应该依赖清理功能,总是上下文转义或使用参数化SQL。)我倾向于使用FILTER_VALIDATE_电子邮件检查电子邮件是否有效,然后进一步,如果需要将电子邮件保存到数据库中,我会去掉危险字符。
mysql和mysqli库也几乎完全处于水深火热之中,因此我建议使用PDO,这是一种更安全的选择
此外,下面的链接建议在电子邮件地址中哪些字符是合法的,在电子邮件地址中允许使用反勾号和单引号,因此可能是为什么FILTER_VALIDATE_电子邮件不接收这些字符…请记住,我们查找的是无效的电子邮件地址而不是危险的电子邮件地址
就像任何编程语言一样,您应该始终将安全性放在列表的首位
永远不要使用验证
,也许你可以使用净化
,但我不推荐这样做
考虑以下代码:
$str = '"mynam@blabl"@domanin.com';
filter_var($str, FILTER_VALIDATE_EMAIL);//return valid email.
基本SQL注入是“或1=1
,您已经听说过。但是我们不能使用espaces,我们需要以类似@something.com
的内容结束此字符串
因此,我们从“
开始,并添加或'1'='1'
这将起作用(因为或1=1
将失败)。现在我们需要@email.com
,让我们将其添加为MySQL注释(--@something.com
)。这就是结果:
$email = filter_var($_GET['email'], FILTER_VALIDATE_EMAIL);
$query = mysqli_query($sql, 'SELECT * FROM table WHERE email = "'.$email.'"');
这是一封对filter\u var
有效的电子邮件,对mysqli\u query
不安全。我稍微更改了标题,以便更好地为未来的一代找到它。相比之下,我99%确信它对sql不安全。但是1%仍然是一个很大的风险。是否有XSS或SQL注入的例子可以验证为该过滤器下的有效电子邮件地址?(出于学术好奇而提问;显然没有理由不使用mysql\u real\u escape\u string()
或类似的转义函数。)“1=1”@domain.com可能就是其中之一。但不太确定。@yc问得好!我一时想不出一个,但使用一些巧妙的组合是非常危险的。
"or'1'='1'--"@email.com