使用php filter_var和mysql_real_escape_string

时间:2015-09-03 14:00:47

标签: php mysql

我想开始我的问题说,我意识到PDO / mysqli是新标准,并且已被广泛涵盖在SO上。但是在这种特殊情况下,我没有时间在启动客户端站点之前将所有查询转换为PDO。

以下内容已在网站上的大多数查询中使用(不是我可以添加)

  $userEmail = filter_var($_POST['fEmail'], FILTER_SANITIZE_EMAIL);
   $userEmail = mysql_real_escape_string($userEmail);
   $sql ="SELECT email FROM members WHERE email = '$userEmail'";
   :
   :

我想知道:

如上例所示,将filter_varmysql_real_escape_string结合使用是否良好/可行?我主要担心的是,这两个函数可以一起使用还是在执行/上传到DB时会产生某种冲突/错误?

同时使用两者有什么好处吗?

提前致谢

4 个答案:

答案 0 :(得分:16)

清理字符串可以使其符合某些期望。 FILTER_SANITIZE_EMAIL会删除字符串中任何在电子邮件中无效的字符。结果(据推测)保证符合电子邮件地址语法。随机删除字符串中的字符是多么有用,我将留给您。 (提示:我认为它根本不是很有用;你应该拒绝无效地址,而不是将它们转换成随机结果。我给你一个无效的电子邮件地址,你把它锤成一些类似的形状一个电子邮件地址,现在你怎么知道你能给我发电子邮件......?!)

mysql_real_escape_string用于确保任意字符串不会违反SQL的字符串文字语法,方法是转义所有符合逃逸的字符。假设你正确使用它(mysql有很多陷阱,这就是为什么它被弃用了......),你可以对它的输入做任何让它失败的事情。你给它任意字符串,它返回转义版本,句号。

因此,总的来说,是的,你正在做的事情很好。如果mysql_real_escape_string last 的事情,那么在将其插入到SQL字符串文字中之前,你会对字符串执行操作,那么它很好。

答案 1 :(得分:3)

在这种情况下,如果过滤器失败,则查询将为:

SELECT email FROM members WHERE email = '0'

所以,不用担心查询;它只是不会返回任何结果。

除非您有类似的插入/更新查询。

在这种情况下,您可以在电子邮件为'0'

的数据库中包含大量行

答案 2 :(得分:2)

使用两者都很好,但你真正应该做的就是不要使用mysql_。您应该使用PDOmysqli_使用预准备语句来避免SQL注入。

请参阅How can I prevent SQL injection in PHP?

或者有关如何切换到MySQLi的指南,请参阅Can I blindly replace all mysql_ functions with mysqli_?

答案 3 :(得分:-3)

您主要担心的是这种过时的方法,这会使您的客户端站点容易受到SQL注入攻击。 关于使用另一个不相关的功能这一小问题,没有什么可担心的。