繁体   English   中英

在PDO注入中使用绑定参数构建查询是否安全?

[英]Is building queries with binding parameters in PDO injection safe?

这是我正在准备的查询。 这看起来太像普通的mysql_query,我不确定是否超出了PDO的安全范围。

function opinionlist($orderby="dateposted desc",$page="0",$pagesize="10"){
  $dbh = new PDO(...);
  $s = $dbh->prepare("select * from fe_opinion 
                       order by :orderby limit :page,:pagesize");
  $s->bindParam(":orderby", $orderby);
  $s->bindParam(":page", $page);
  $s->bindParam(":pagesize, $pagesize");
  $s->execute();
  $opinionlist = $s->fetchAll(PDO::FETCH_ASSOC);
  echo json_encode($opinionlist);
}
  1. 我可以安全地建立这样的查询吗?
  2. 通过语句获取订单的表名是安全的还是应从输入中获取值?

目前,我将代码更改为

function opinionlist($orderby="dateposted desc",$page="0",$pagesize="10"){
  $orderbylist=array("dateposted desc","countcomment desc","countvote desc");
  $dbh = new PDO(...);
  if(!in_array($orderby, $orderbylist)){$orderby="dateposted desc";}
  $s = $dbh->prepare("select * from fe_opinion order by $orderby limit :page,:pagesize");
  $s->bindParam(":page", $page);
  $s->bindParam(":pagesize, $pagesize");
  $s->execute();
  $opinionlist = $s->fetchAll(PDO::FETCH_ASSOC);
  echo json_encode($opinionlist);
}

验证输入的类型和内容是一个好习惯。

您可以使用mysql_real_escape_string()清理$orderby或拒绝$orderby值,这些值不包含单个有效的列名,后跟可选的ascdesc (如果需要,甚至可以是逗号分隔的列表)。 您可以通过硬编码或请求该表的列列表来确定有效列的列表(从INFORMATION_SCHEMA)。

当然,您可以将is_numeric()用于$page$pagesize

有了它,不仅可以防止sql注入,还可以使代码更健壮。


小更新:如您所知,您不能为$orderby使用参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM