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

SQL Injection и Codeigniter

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

  • Если я использую Active Record Функции класса в CodeIgniter, мой вход предотвращен от SQL-инъекции?
  • Я где-то читал, что это так, но я не понимаю, как это сделать? или почему?
  • Также xssclean имеет дело с SQL-инъекцией каким-либо образом?
4b9b3361

Ответ 1

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

Также xssclean справляется с SQL-инъекцией каким-либо образом?

Нет. Он нацелен на HTML-инъекцию. Но это хуже, чем бесполезно. Никогда не используйте его.

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

Ответ 2

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

$this->input->post() 

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

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

В рамках CI проверьте файл

Codeigniter->System-libraries->input.php

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

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

Ответ 3

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