Экранирование CodeIgniter MySQL

#mysql #codeigniter #pdo

#mysql #codeigniter #pdo

Вопрос:

Я запускаю следующий запрос:

 INSERT INTO deal (`site_id`, `status`, `slug`, `title`, `description`, `condition`, `sale_price`, `shipping`, `deal_url`, `buy_url`, `start`, `added`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, NOW()) ON DUPLICATE KEY UPDATE `site_id` = ?,`status` = ?,`slug` = ?,`title` = ?,`description` = ?,`condition` = ?,`sale_price` = ?,`shipping` = ?,`deal_url` = ?,`buy_url` = ?,`start` = ?
  

Построено с помощью этого кода:

     $this->db->query('INSERT INTO
            deal
                (`'.implode('`, `', array_keys($insert)).'`, `added`)
            VALUES
                ('.implode(', ', array_fill(0, count($insertValues), '?')).', NOW())
            ON DUPLICATE KEY UPDATE
            '.implode(',', array_keys($update)), array_merge($insertValues, array_values($update)));
  

Проблема в том, что мой запрос не экранируется должным образом….

 INSERT INTO deal (`site_id`, `status`, `slug`, `title`, `description`, `condition`, `sale_price`, `shipping`, `deal_url`, `buy_url`, `start`, `added`) VALUES ('2', 1, http://www.woot.com/sale/sony-dash-personal-internet-viewer-7, 'Sony Dash Personal Internet Viewer', 'Finally, someone made me my own, personal internet!', 'New', '69.99', $5 shipping, http://www.woot.com/sale/sony-dash-personal-internet-viewer-7, , 1305867600, NOW()) ON DUPLICATE KEY UPDATE `site_id` = '2',`status` = 1,`slug` = http://www.woot.com/sale/sony-dash-personal-internet-viewer-7,`title` = 'Sony Dash Personal Internet Viewer',`description` = 'Finally, someone made me my own, personal internet!',`condition` = 'New',`sale_price` = '69.99',`shipping` = $5 shipping,`deal_url` = http://www.woot.com/sale/sony-dash-personal-internet-viewer-7,`buy_url` = ,`start` = 1305867600
  

У меня установлена фильтрация XSS …. я что-то упускаю?

Комментарии:

1. Инъекции XSS и sql — это уязвимости разного рода, и их следует обрабатывать разными способами.

2. Суть PDO обычно в том, что запросы абстрагируются и, следовательно, не требуют экранирования, поскольку они не требуют сборки. Я не знаком с CodeIgniter, но я рекомендую вам подтвердить, что не существует более стандартного способа выполнения этой вставки.

3. @Matchu У них есть нечто, называемое ActiveRecord ( codeigniter.com/user_guide/database/active_record.html ), но у этого ON DUPLICATE KEY UPDATE нет эквивалентной функции, поэтому вам придется сначала выполнить SELECT , чтобы проверить, существуют ли данные

Ответ №1:

Странно. Каково определение базы данных? Единственное, о чем я могу думать, это то, что уровень DB приходит к выводу, что некоторые из этих столбцов не нуждаются в экранировании.