把 PDO::quote 的结果去掉两边的单引号,其结果和 mysqli_real_escape_string 等效么,安全么?

2017-10-12 18:39:08 +08:00
 gouchaoer
PDO::quote 的字符串有个麻烦就是两边带上了单引号,现在我在处理一些历史遗留代码,所以直接写了个函数类似这样:
function escape($str)
{
global $pdo;
return substr($pdo->quote($str), 1, -1);
}

然后实际这样用:
$id=$_GET['id'];
$id=escape($id);
$sql="SELECT * FROM t WHERE id={$id}";
...

这样安全么?
2874 次点击
所在节点    PHP
7 条回复
gouchaoer
2017-10-12 18:40:17 +08:00
mysqli_real_escape_string 就不带两边的单引号,不过这里用的是 PDO
WuwuGin
2017-10-12 19:28:24 +08:00
pdo queto 就是添加单引号和处理转义特殊字符的,单引号里面的内容不会被 PHP 执行。你这样去掉等于没有使用此函数。
如果想避免注入,使用 prepare 函数,在需要执行用户输入的参数的时间,使用 bindParam 或者 bindValue。
2ME
2017-10-13 09:44:05 +08:00
prepare 预处理 bind 绑定设置参数 PDO::PARAM_INT
gouchaoer
2017-10-13 10:55:11 +08:00
@WuwuGin 写错了,是这样的:$sql="SELECT * FROM t WHERE id='{$id}'";
gouchaoer
2017-10-13 10:56:02 +08:00
我知道 bind 好,但是历史代码是那样的,你 bind 要改很多逻辑,我没办法保证不出问题,还是对输入消毒改动小
gouchaoer
2017-10-13 11:01:02 +08:00
WuwuGin
2017-10-13 14:35:20 +08:00
@gouchaoer 其实我觉得你这样是符合 queto 函数的最终目的的。但是防注入不光靠 queto 啊。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/397147

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX