ЗОП готовит заявления: нужно ли бежать? - PullRequest
2 голосов
/ 20 сентября 2010
public function receiveDomainNames($keyword)
{
  try
  {
    $stmt = $this->_dbh->prepare("SELECT d.someField FROM domain d WHERE d.someField LIKE :keyword");
    $someField = '%'.$keyword.'%';

Нужно ли нам экранировать ключевое слово $ в этом случае?

В руководстве по PHP мы можем прочитать:

ЕслиПриложение использует только подготовленные операторы, разработчик может быть уверен, что внедрение SQL не произойдет ( однако, если другие части запроса создаются с неэкранированным вводом, внедрение SQL по-прежнему возможно ).

По вашему мнению, так ли это, в этом случае вы создаете неэкранированный ввод (ранее не обрабатывался наш параметр $ keyword)?

Заранее спасибоMEM

Ответы [ 2 ]

1 голос
/ 20 апреля 2011

Учитывая приведенную выше инструкцию SQL, я не вижу рациональной возможности внедрения SQL.

Каким предупреждением о «других частях» будет SQL-запрос, например:

$binds = array(":id"=>$_GET['id']);
$myPDO->prepare("SELECT {$_GET['columns']} FROM {$_GET{['table']} WHERE id = :id");
$statement = $myPDO->execute($binds);

Этот пример является наихудшим / явным примером того, что они имеют в виду, что наивно кто-то может подумать, посколькуони избегают аргумента where, что все безопасно.

В приведенном выше примере нет неэкранированного ввода, поэтому вы в безопасности.

0 голосов
/ 04 февраля 2017

Если приложение использует исключительно подготовленные операторы, разработчик может быть уверен, что SQL-инъекция не произойдет ( однако, если другие части запроса создаются с неэкранированным вводом, SQL-инъекция все еще возможна).

Я бы подумал, что переменные, которые вы создаете, не должны быть экранированы, потому что вы знаете, что они делают.

Только экранирующий контент, полученный от пользователятакие как $ _COOKIE, $ _POST, $ _GET и другие параметры, такие как URL.

...