这是我正在准备的查询。这看起来像一个普通的mysql_query,我不确定我是否超出了PDO的安全边界。是否在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);
}
这可能实际上不适用于“LIMIT”。参数不会替换串联的变量。你可以做'LIMIT:offset,:limit',但是你不能用单个参数替换整个LIMIT子句。 –
@Michael我改变了页面参数,我的查询仍然获取按语句顺序的表名。除了价值注入安全之外,还有其他的东西吗? –
你不能“绑定”列名。这不是一个准备好的声明,而是使其再次变得动态。 – mario