Php 过滤验证电子邮件是否使字符串安全地插入数据库?

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()等特定数据库的替代品!人们也需要始终应用这一

上面的电子邮件返回true。。。很公平,RFC2822说这是一个合法的电子邮件地址

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

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


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