php PDO中exec函数怎么防止sql注入,需要提前prepare吗?

新手上路,请多包涵

php PDO中exec函数怎么防止sql注入,需要提前prepare吗?

我看到$pdo防sql注入是先prepare再excute,比如查询操作和插入操作,数据都是前台提交过来的

$sql="select pid,id,time,name,pl,znum,cnum from test where aid=? and status=1 order by id desc";
$pdo->prepare($sql);
$pdo->execute(array($_POST['aid']));
.....

这种没问题,但是这种

$sql="insert into test(aid,pid,time,name,pl,ip) values ({$res['aid']},{$res['pid']},".time().",'".$res['nc']."','".$res['nr']."','{$ip}')";
$pdo->exec($sql);

如果如上执行,怎么防止SQL注入,在没个POST参数上面加quote()吗?
exec可以先prepare吗?

阅读 2.3k
3 个回答

SQL注入,首先理解其概念,就是利用各种分隔符,分割和伪造运行的sql,达到注入的目的。
另外prepare记得不错的话是预处理的过程,后面的参数只是占坑,在运行时进行填坑,填坑的过程中,就仅仅作为参数填进去,至于里面带有的注入sql,则仅仅只是作为一个参数了而已,可以理解为被转义掉。
如果sql没有坑,你prepare也没有意义。

新手上路,请多包涵

首先你的代码有问题,正确的应该是:

$sql = "....";
$sth = $pdo->prepare($sql);
$sth->execute();

根据文档,PDO::exec的参数有这样的描述:查询中的数据应该被妥善地转义,说明需要用户自己去进行参数的转义。
PDO防注入是将SQL语句区分成模版和参数两部分,参数会被预处理/转义,然后填充到模版生成最终的SQL语句,参数的转义可以由PDO处理(使用PDOStatement);也可以由用户程序处理,那就是你先对post的数据做预处理后,再直接执行。

任何情况下都不要手动拼接SQL

如果你的SQL是手动拼接的,没用使用到prepare,那么就算是PDO也救不了你

一般开发流程如下:

  1. prepare处理SQL
  2. 参数绑定
  3. 执行

这样可以从源头解决SQL注入问题。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题