Безопасно ли строить запросы с параметрами привязки в PDO-инъекции? - PullRequest
0 голосов
/ 08 декабря 2011

Это запрос, который я готовлю.Это слишком похоже на обычный запрос 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. Безопасно ли получать имя таблицы для заказа по выражению или мне ONLY можно получить значения изввод?

В настоящее время я изменил свой код на

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);
}

1 Ответ

1 голос
/ 08 декабря 2011

Хорошей практикой является проверка типа и содержимого ваших входных данных.

Вы можете очистить $orderby с помощью mysql_real_escape_string() или отклонить значения для $orderby, которые не состоят из одного допустимого имени столбцаза которым следует необязательный asc или desc (или даже список из них через запятую, если хотите).Вы можете определить свой список допустимых столбцов либо путем жесткого кодирования, либо запросив список столбцов для этой таблицы (из INFORMATION_SCHEMA).

И, конечно, вы можете использовать is_numeric() для $page и $pagesize.

Имея это в виду, вы не только защищаете от внедрения SQL, но и делаете свой код болеенадежный.


Небольшое обновление: как вы обнаружили, вы не можете использовать параметр для $orderby.

...