Безопасное программирование в PHP: SQL-инъекции

by jeurey on Февраль 10, 2008

SQL-инъекция является очень распространенным типом атак на ресурсы. Неправильное проектирование системы и отсутствие фильтрации входных данных может привести к тому, что ваша база данных может быть получена/испорчена злоумышленником.

Характерным признаком для SQL-инъекций является наличие SQL-запросов или его составляющих в передаваемых параметрах. Рассмотрим простейший случай.

Адрес вашей страницы выглядит так: http://www.hacked-resource.com/page.php?cat_id=1
Получение id-страницы выглядит вот так:
[code lang='php']
$cat_id=$_REQUEST['cat_id'];
?>
[/code]
Ваша страница выводится запросом
[code lang='php']
//// .... ////
mysql_query('SELECT * FROM content WHERE cat_id='.$cat_id);
////....///
?>
[/code]
При отсутствии фильтрации и попытке запросить страницу с адресом http://www.hacked-resource.com/page.php?cat_id=1+or+1=1 ваш скрипт выведет все записи из таблицы content.

В адресе атакуемой страницы мы наблюдаем кусок SQL-инструкции “+or+1=1″. Собрав и проанализировав такие “бутылочные горлышки” вашей системы вы прийдете к выводу, что необходимо обеспечивать должный уровень фильтрации данных. Никто не спорит, что это непросто… Однако, элементарный список SQL-инструкций и его соспоставление на вхождение в URI весьма уменьшит риск подобных “хулиганств”.

Конечно же, это поможет только при элементарных знаниях взломщика. Чтобы написать систему, которая будет способна противостоять хакеру, вам необходимо иметь хотя бы тот же уровень знаний, что и у него.

Очень немногие “программисты” знают о возможности полного html-кодирования строк, не говоря уж о SQL-комментариях. Если элементарные меры и могут противостоять попыткам взлома, но они в 99% неэффективны при усложнении запросов, хотя бы до уровня
http://www.hacked-resource.com/page.php?cat_id=/*абракадабра*/1+or/*абракадабра*/+/*абракадабра*/1=1

{ 5 comments… read them below or add one }

1 DeveloperGuru.NET 02.10.08 at 2:45 дп

Так никакого простого способа защититься от этого в PHP нет?

В ASP.NET подобная запись является доказательством полной некомпетентности кодера, т.к. есть SQL параметры, через которые SQL injection не пройдет.

2 jeurey 02.10.08 at 4:05 дп

Я не совсем понимаю, что вы имели ввиду…
В php есть функции mysql_real_escape_string / mysql_escape_string, которые служат для экранирования спецсимволов.

Данная заметка ориентирована не на описание обеспечения безопасности и панацеи от SQL-инъекций, а нацеливает начинающего/продолжающего программиста на “задуматься”.

3 SeoCoder 02.10.08 at 5:47 дп

давайте уважать друг друга и не “выкать”. ;)

4 DeveloperGuru.NET 02.12.08 at 9:44 пп

Насколько я понимаю, функции mysql_real_escape_string / mysql_escape_string не спасут в описанном в посте случае, когда cat_id=1+or+1=1. Тут, как я понимаю, надо делать привидение в int и обратно в строку (при конкатенации). Это не совсем логично.

В .NET параметр cat_id будет типа int, поэтому и передавать надо int, конкатенаций параметров со строкой запроса никто не делает.

5 jeurey 02.12.08 at 10:16 пп

От cat_id=1+or+1=1 такие вещи не спасут - это вы верно заметили. Однако, от 16-ичного представления и/или полного html-кодирования символов сложения/пробела и т.д. спасают.

Leave a Comment

You can use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>