CodeIgniter автоматически предотвращает внедрение SQL?


Я просто унаследовал проект, потому что последний разработчик ушел. Проект построен от воспламенителя кода. Я никогда раньше не работал с воспламенителем кода.

я быстро взглянул на код, и я вижу вызовы базы данных в контроллере следующим образом:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$_POST['user_name']."'");

или звонит вот так:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$this->input->post('username')."'");

выполняет ли code igniter автоматическую очистку этих запросов, чтобы предотвратить инъекцию sql?

12 56

12 ответов:

CodeIgniter действительно экранирует переменные, которые вы проходите при использовании $this->db->query метод. Но только когда вы передаете переменные как привязки, вот пример:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '?'", array($this->input->post('username')));

также помните, что $_POST не должно быть предпочтительнее, чем $this->input->post поскольку он проверяет, существуют ли переменные для предотвращения ошибок.

CodeIgniter предоставляет несколько функций экранирования строк в своем слое базы данных.

фрагмент CI Manual:

Это очень хорошая практика безопасности, чтобы защитить ваши данные перед отправкой в базу данных. CodeIgniter имеет три метода это поможет вам сделать это:

  1. $this - > db - >escape () эта функция определяет тип данных, так что он может избежать только строковые данные. Оно также автоматически добавляет одинарные кавычки вокруг данных, так что вам не нужно:

    $sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
    

Я бы опубликовал два других примера, но я бы не хотел брать все удовольствие от чтения руководства.

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

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";

$this->db->query($sql, array(3, 'live', 'Rick')); 

нет, CodeIgniter не будет волшебным образом санировать запросы, которые были построены таким образом.

согласно документам CI здесь, рамки фильтруют столб на конструкции регулятора. Он также дополнительно выполняет фильтрацию XSS либо вручную вызывая функцию, либо устанавливая глобальную конфигурацию.

Я никогда не использовал CI, кроме как просто играть с ним, поэтому я не уверен, насколько я доверяю этому.

Это ничего не спасает. Вам лучше изменить его на синтаксис привязки или активная запись синтаксис

вы должны использовать $this - > input - >post, привязку запроса и активную запись, чтобы иметь более безопасные данные, а затем еще и тестовый тест, чтобы быть уверенным.

используйте активную запись для безопасности и упрощения кодирования:

вместо:

  $dbResult = $this->db->query("SELECT * FROM users WHERE username'".$_POST['user_name']."'");

использовать (тот же результат):

$this->db->where('username',$this->input->post('user_name');
$dbResult = $this->db->get('users');

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

я копирую из руководства CodeIgniter: "Помимо простоты, главное преимущество использования Активная Запись особенности заключается в том, что он позволяет создавать независимые от базы данных приложения, так как синтаксис запроса генерируется каждым адаптером базы данных. Это также позволяет для более безопасных запросов, так как значения автоматически экранируются системой."

и, как некоторые люди уже сказали, Да этот код восприимчив к SQL-инъекции

оптимизирован со вторым post param (TRUE) для фильтрации XSS на входном уровне:

$this->db->where('username',$this->input->post('user_name', TRUE);
$dbResult = $this->db->get('users');

библиотеки/вход.HTML-код

документы для (по крайней мере) 2.2 состояния, в большом красном поле:

хотя Active Record будет стараться изо всех сил правильно цитировать любые имена полей и таблиц, которые вы его загружаете, обратите внимание, что он не предназначен для работы с произвольным пользовательским вводом. Не загружайте его с незарегистрированными пользовательскими данными.

что для этого программиста означает "Не полагайтесь на активную запись, чтобы цитировать что-нибудь".

использование функции escape для инъекции CI

<?php $username = $this->input->post('username');
$query = 'SELECT * FROM subscribers_tbl WHERE user_name = '.$this->db->escape($email);
$this->db->query($query);?>