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

StackOverflow https://stackoverflow.com/questions/1615792

  •  06-07-2019
  •  | 
  •  

Вопрос

Я только что унаследовал проект, потому что ушел последний разработчик.Проект построен на основе 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?

Это было полезно?

Решение

CodeIgniter УДАЛЯЕТ переменные, которые вы передаете, используя метод $ this- > db-> gt; 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 здесь , инфраструктура фильтрует POST при построении контроллера. Кроме того, он также может выполнять XSS-фильтрацию, вызывая функцию вручную или устанавливая глобальную конфигурацию.

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

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

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

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

Вместо:

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

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

Вместо:

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

Используйте (тот же результат):

<*>POST['user_name']."'");

Используйте (тот же результат):

<*>

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

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

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

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

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

библиотеки / input.html

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

  

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

Что для этого программиста означает " не полагайтесь на 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);?>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top