這是我正在準備的查詢。這看起來像一個普通的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