Автоматически ли CodeIgniter предотвращает SQL-инъекцию?

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

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

$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 ответов


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

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

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


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

фрагмент руководство CI:

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


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


вы должны использовать $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);?>