Codeigniter: update_batch не экранирует имена полей - PullRequest
0 голосов
/ 04 февраля 2012

Я пытаюсь использовать функцию update_batch() из помощника Active Record в Codeigniter следующим образом:

var_dump($data);
$this->db->where('event_id',$data['event_id']);
$this->db->update_batch('results',$data['results'],'uid');
echo $this->db->last_query();

Это выводит следующее:

array(2) {
  ["event_id"]=>
  string(2) "11"
  ["results"]=>
  array(2) {
    [0]=>
    array(2) {
      ["uid"]=>
      string(36) "1beab26d-f705-11e0-a190-f46d048dfd25"
      ["res"]=>
      string(1) "2"
    }
    [1]=>
    array(2) {
      ["uid"]=>
      string(36) "9dcc9e0a-bf24-11e0-838c-f46d048dfd25"
      ["res"]=>
      string(1) "1"
    }
  }
}
UPDATE results SET res = CASE 
WHEN uid = '1beab26d-f705-11e0-a190-f46d048dfd25' THEN '2'
WHEN uid = '9dcc9e0a-bf24-11e0-838c-f46d048dfd25' THEN '1'
ELSE res END WHERE `event_id` = '11' AND uid IN ('1beab26d-f705-11e0-a190-f46d048dfd25','9dcc9e0a-bf24-11e0-838c-f46d048dfd25')

Очевидно,является большой дырой в безопасности, поскольку имена полей и таблиц не экранируются из раздела update_batch (хотя они экранируются в разделе where).Я делаю что-то неправильно?Это поведение не указано в документации:

http://codeigniter.com/user_guide/database/active_record.html#update

1 Ответ

1 голос
/ 04 февраля 2012

Хм, согласно документации для функции update_batch (), они просто утверждают, что

"значения автоматически экранируются, создавая более безопасные запросы"

с этими словамиЯ вижу, подразумевается, что поля и имена таблиц не защищены.

Но на странице "запросов" они как бы противоречат, говоря:

Во многих базах данных желательнозащитить имена таблиц и полей - например, с помощью обратных галочек в MySQL.Запросы Active Record автоматически защищаются, однако если вам нужно вручную защитить идентификатор, вы можете использовать:

$ this-> db-> protect_identifiers ('table_name');

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

РЕДАКТИРОВАТЬ:

Хм, я просто быстро пошел по коду, и выглядит, как это сбежал :

// Batch this baby
for ($i = 0, $total = count($this->ar_set); $i < $total; $i = $i + 100)
{
   $sql = $this->_update_batch($this->_protect_identifiers($table, TRUE, NULL, FALSE), array_slice($this->ar_set, $i, 100), $this->_protect_identifiers($index), $this->ar_where);

   $this->query($sql);
}

Итак, migth действительно будет ошибкой;Пока что, если ваши имена таблиц не генерируются динамически, вы можете просто проигнорировать это и в любом случае быть в безопасности;или вы можете запустить метод protect_identifiers() и сделать это самостоятельно (в принципе неправильно, но эй ...).

Вы можете попытаться воспроизвести ошибку более одного раза, а затем отправить файл сообщение об ошибке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...