Подтвердить что ты не робот

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')."'");

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

4b9b3361

Ответ 1

CodeIgniter УДАЛЯЕТ переменные, которые вы проходите при использовании метода $this->db->query. Но ТОЛЬКО когда вы передаете переменные как привязки, вот пример:

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

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

Ответ 2

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

Выдержка из Руководство CI:

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

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

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

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

Ответ 3

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

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

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

Ответ 4

Нет, CodeIgniter не будет магически дезинфицировать запросы, которые были построены следующим образом.

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

Скорее, чем:

  $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');

Ответ 9

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

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

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

Ответ 10

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

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

libraries/input.html

Ответ 11

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

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

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

Ответ 12

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

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