Внедрение SQL и Codeigniter - PullRequest
       15

Внедрение SQL и Codeigniter

12 голосов
/ 26 сентября 2010

Некоторые сомнения относительно Codeigniter и его возможностей обработки ввода. Некоторые могут быть немного странными, но они, тем не менее, сомневаются.

  1. Если я использую функции класса Active Record в CodeIgniter, мой ввод будет защищен от внедрения SQL?
  2. Я где-то читал, что это так, но я не понимаю, как? или почему?
  3. Кроме того, xssclean как-то работает с SQL-инъекцией?

Ответы [ 3 ]

16 голосов
/ 26 сентября 2010

мой вход защищен от внедрения SQL?

Не совсем "автоматически", но он обеспечивает параметризованные запросы.CodeIgniter или нет, вы должны использовать параметризованные запросы в предпочтении для взлома строки запроса, когда это возможно.

$bof= "a'b";
$zot= 'a\b';

// Insecure! Don't do this!
//
$this->db->query("SELECT foo FROM bar WHERE bof='$bof' AND zot='$zot'"); 

// Secure but annoying to write
//
$this->db->query("SELECT foo FROM bar WHERE bof='".$this->db->escape($bof)."' AND zot='".$this->db->escape($zot)."'"); 

// This is what you want
//
$this->db->query('SELECT foo FROM bar WHERE bof=? AND zot=?', array($bof, $zot)); 

Обратите внимание, что это не имеет ничего общего с «вводом»: когда вы делаете запрос SQL из строк, вы должен использовать параметризацию или экранирование, чтобы сделать их подходящими, независимо от того, введены они пользователем или нет.Это вопрос простой правильности;безопасность является побочным эффектом этой правильности.

Аналогично, когда вы выводите текст в HTML, вам нужно кодировать в него <, & и " символов , а затем .Абсолютно бесполезно пытаться поиграть с вводом, чтобы избежать или удалить символы, которые могут быть проблематичными в будущем, если вам случится использовать их без экранирования в SQL или HTML.Вы будете манипулировать своим выводом, имея неожиданный SQL-выход в HTML (именно поэтому вы видите самосумножающиеся обратные слэши в плохо написанных приложениях) и нежелательный HTML-переход в SQL.И если вы берете текст откуда-то, кроме прямого ввода пользователя (скажем, материала, уже находящегося в базе данных), который вас вообще не защищает.

Кроме того, xssclean имеет какое-либо отношение к SQL-инъекции?

Нет.Он нацелен на внедрение HTML.Но это хуже бесполезного .Никогда не используйте его.

«XSS-фильтрация» полностью поддельная (опять же, CodeIgniter или кто-то еще).XSS нужно предотвратить, правильно выводя HTML-код, а не искажая ввод.XSS-фильтрация не адекватно защитит вас, если ваше приложение еще не защищено;в лучшем случае это запутает ваши существующие недостатки и даст вам ложное чувство безопасности.Он также будет искажать множество допустимых входных данных, которые CI считает похожими на теги.

1 голос
/ 26 сентября 2010

1. это делает, если вы делаете это правильно

2. Вы, вероятно, заметили, что все вызовы функций выполняются так, что пользовательские данные передаются в одной переменной каждый. Таким образом, у вас даже нет возможности передавать управляющий код SQL и пользовательские данные в одну переменную. Короче говоря, данные заключены в одну переменную каждая. Поэтому его можно безопасно кодировать, не нарушая ваш код SQL. Исключение, однако, если вы передаете весь запрос. Тогда это невозможно. Если вы делаете

$db->query("select * from table where password = 'hello ' or '1=1");

нет никакого способа сказать, что следует избегать, а что нет, но если вы укажете это так

$db->query("select * from table where password = ?",array('param1'));

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

3. Да, это так, но его главная цель не состоит в том, чтобы предотвратить инъекцию sql, я бы предпочел http://codeigniter.com/user_guide/libraries/input.html

1 голос
/ 26 сентября 2010

Когда вы используете пользовательский ввод, пропустите его через библиотеку ввода, где он фильтрует для инъекций xss и sql.

$this->input->post() 

http://codeigniter.com/user_guide/libraries/input.html

Проверьте дополнительную информацию о безопасностифильтрация.

В структуре CI проверьте файл

Codeigniter->System-libraries->input.php

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

XSS Очистка в основном означает фильтрацию нежелательных тегов XHTML / HTML

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