我想开始我的问题说,我意识到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_var
和mysql_real_escape_string
结合使用是否良好/可行?我主要担心的是,这两个函数可以一起使用还是在执行/上传到DB时会产生某种冲突/错误?
同时使用两者有什么好处吗?
提前致谢
答案 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_
。您应该使用PDO
或mysqli_
使用预准备语句来避免SQL注入。
请参阅How can I prevent SQL injection in PHP?
或者有关如何切换到MySQLi的指南,请参阅Can I blindly replace all mysql_ functions with mysqli_?
答案 3 :(得分:-3)
您主要担心的是这种过时的方法,这会使您的客户端站点容易受到SQL注入攻击。 关于使用另一个不相关的功能这一小问题,没有什么可担心的。