2010-09-26 3 views
12

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

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

Слово «активная запись» может быть неправильно истолковано, а документы CI имеют изменения в 'query builder' https://codeigniter.com/user_guide/database/query_builder.html – teek

ответ

16

мой вход предотвращено против инъекции 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, выглядят как теги.

+0

Интересно! Последнее особенно важно. Я думаю, что ваш путь действительно лучше. – OrangeRind

+2

Подумайте, почему Cs's xssclean бесполезен? Мне очень любопытно! Это половина причины, по которой я использую CI. Я хотел бы знать, не обманываю ли я себя и не защищу! – kevtrout

+0

Если вы помните о том, что HTML-escape все строки, которые вы выводите на свои HTML-страницы, вы защищены, независимо от того, используете ли вы 'xss_clean', и все, что он будет делать для вас, тихонько искажает ваши строки ввода, пугающе причудливыми пути. Серьезно, посмотрите на 'function xss_clean' в' Input.php' и смеетесь, поскольку он заменяет вещи '%' in, URL-декодирует, снова заменяет вещи '%', разрывает URL-кодированные ссылки, искажает слова с амперсанды между ними, ускользает от * some * less-than-sign до '<' и не позволяет вам говорить о' innerHTML' или использовании слова 'alert' ... и более ... – bobince

1

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

$this->input->post() 

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

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

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

Codeigniter->System-libraries->input.php 

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

XSS чистые в основном означает, отфильтровывая ненужные XHTML/HTML-тег

+0

Согласно вашей собственной ссылке' $ this-> input- > post() 'ничего не делает для предотвращения SQL-инъекции. – Mischa

1

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. Да это, но его primpary цель не предотвратить SQL инъекции, я предпочел бы полагаться на http://codeigniter.com/user_guide/libraries/input.html

+0

Я думаю, что здесь не должно быть одиночных кавычек вокруг параметра '?'. – bobince

+0

Хм ... не могу сказать. Я думаю, что это правильно. конечно, вам это не нужно, когда у вас целые числа, но это не имеет большого значения ... так что, вероятно, лучше написать его так? –

+1

Ну, я не пробовал это с помощью CodeIgniter, но, безусловно, наиболее распространенным способом выполнения параметризованных запросов является использование bare '?' В качестве точки замены и обработка ''? ''В строке как фактическая вопросительный знак. В любом случае, это синтаксис, указанный в http://codeigniter.com/user_guide/database/queries.html. – bobince