[英]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);
}
目前,我将代码更改为
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
值,这些值不包含单个有效的列名,后跟可选的asc
或desc
(如果需要,甚至可以是逗号分隔的列表)。 您可以通过硬编码或请求该表的列列表来确定有效列的列表(从INFORMATION_SCHEMA)。
当然,您可以将is_numeric()
用于$page
和$pagesize
。
有了它,不仅可以防止sql注入,还可以使代码更健壮。
小更新:如您所知,您不能为$orderby
使用参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.