CodeIgniter автоматически предотвращает внедрение SQL? - PullRequest
59 голосов
/ 24 октября 2009

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

Ответы [ 12 ]

68 голосов
/ 24 октября 2009

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

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

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

21 голосов
/ 21 января 2010

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

Выдержка из CI Manual :

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

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

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

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

13 голосов
/ 25 октября 2009

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

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

$this->db->query($sql, array(3, 'live', 'Rick')); 
3 голосов
/ 24 октября 2009

Согласно документации CI здесь , каркас фильтрует POST при построении контроллера. При необходимости также выполняется XSS-фильтрация путем ручного вызова функции или установки глобальной конфигурации.

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

3 голосов
/ 24 октября 2009

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

2 голосов
/ 11 января 2013

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

Вместо:

  $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');
2 голосов
/ 26 октября 2009

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

2 голосов
/ 26 октября 2009

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

0 голосов
/ 08 сентября 2016

Использование функции выхода для введения CI

<?php $username = $this->input->post('username');
$query = 'SELECT * FROM subscribers_tbl WHERE user_name = '.$this->db->escape($email);
$this->db->query($query);?>
0 голосов
/ 08 августа 2015

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...