Предисловие
SQL инъекции довольно опасная вещь. С их помощью уже не раз “ложили” как крупные правительственные сайты, так и тысячи персональных веб-ресурсов. (Одно время это был довольно популярный способ самоутверждения среди подростков по всему миру). Хотите верьте, хотите нет, но система безопасности вашего веб-ресурса может быть повергнута парой строчек программного кода.
SQL инъекция: На что она похоже и с чем ее едят
Доктор Хаус из очень популярного сериала абсолютно прав, говоря что пациенты всегда лгут. Эту аксиому можно применить и для нашего случая с условием, что вместо пациентов будут выступать интернет-пользователи. Никогда не стоит забывать о защите! Ведь пользователи поголовно коварные, хитрые, они так и норовят сделать вам какую-нибудь гадость.
Так что же такое SQL инъекция? Дадим определение данному понятию:
SQL инъекция – техника внедрения вредоносных данных в SQL утверждение, которые затем делают уязвимой и доступной информацию, содержащуюся в базах данных сайта.
Как ни удивительно, практически каждый новичок, изучающий веб-языки программирования, пытается применить данную вредоносную технологию на своих любимых сайтах. Большинство SQL инъекций применяются в формах ввода. Но не стоит заблуждаться на счет того, что речь идет только об видимых формах ввода. Очень часто для проникновения кода SQL инъекции используется URL сайта (об этом будет подробнее рассказываться далее).
Вот как в основном выглядит традиционная SQL инъекция:
Variable' or 1=1—
|
Допустим, мы имеем логин-форму. Введя вышеописанный кусок кода в логин-форму, можно получить доступ к ресурсу, даже не имея на это соответствующих прав. Как же это работает? Давайте более подробно рассмотрим механизм воздействия SQL инъекции:
SELECT * FROM users WHERE username = 'Variable' or 1=1--'
|
Видите, как мило наш код вписался в запрос? В результате он предоставит нам доступ несмотря на имя пользователя, так как утверждение 1=1 всегда будет истинным. В данном случае мы обошли стороной весь процесс выборки.
Вы можете вполне разумно поинтересоваться, зачем нужен двойной дефис “--” в конце кода. SQL сервер игнорирует ту часть запроса, которая находится после “--”. Если подвиг совершается не против SQL сервера, то данную конструкцию желательно опустить.
Стоит однако заметить, что описан самый стандартный случай SQL инъекции, но конечно же он не единственный. Из-за того, что SQL запросы очень разнообразны по синтаксису, под каждый определенный запрос нужна определенная SQL инъекция. Вот еще несколько примеров SQL-инъекций:
') or ('1'='1 |
SQL инъекция: Атака через URL
Вы знали о том, что SQL сервер можно атаковать через URL? Да, это на самом деле можно сделать, и обычно атаки такого типа наиболее опасны и неприятны для веб-мастеров. Когда на сайте задействованы PHP и SQL, то URL обычно выглядит следующим образом:
http://YourWebsite.com/login.php?id=2
|
Добавив небольшую SQL инъекцию в конец URL, можно натворить много нехороших вещей. К примеру, рассмотрим следующую SQL инъекцию:
http://YourWebsite.com/login.php?id=2‘; DROP TABLE login; #
Данный крошечный кусок кода дает команду SQL серверу на сброс всей таблицы пользователей. А это очень, очень неприятно. Этот пример ярко показывает, насколько опасными и мощными могут быть SQL инъекции, а также он указывает на необходимость неизменных бэкапов.
В принципе достаточно писать о том, как навредить сайту с помощью SQL инъекций. Данная статья посвящена тому, как обезопасить кропотливые труды, вложенные в создание и развитие сайта, от этих небольших, но далеко не безобидных программ.
Защита от SQL инъекций: Создание лимитированной длинны ввода в форме компонентов
Первый шаг довольно прост: ввести ограничение на длину в поле ввода (обычно вполне достаточно 7-12 символов). Данное ограничение очень просто реализовать, и оно гарантированно сделает недоступным ввод длинных запросов. Вот пример того, как данная мера не дает навредить SQL инъекции:

Конечно сообразительный пользователь может создать для атаки новую форму и убрать из нее ограничения на длину ввода, ведь она очевидна из HTML-кода и может быть изменена в принципе кем угодно.
Защита от SQL инъекций: Утверждение определенного формата ввода данных
Еще одна неплохая идея – ратифицировать формат вводимых данных. Если в поле требуется ввести возраст, то вполне разумно ограничить формат ввода целыми числами. Но опять же, это не оградит вас полностью от SQL инъекции, а просто сделает данное вмешательство более трудным.

Защита от SQL инъекций: Права пользователей
Конечно, очень удобно, когда есть возможность наделить пользователя правами добавлять, удалять и редактировать информацию в какой-то базе данных. Однако веб-мастер, которому не все равна безопасность своего ресурса, должен предусмотреть, чтобы каждый отдельный пользователь с такими правами мог выполнять только одну или две операции одновременно. Данное ограничение будет означать, что, в случае чего, SQL инъекция сможет делать одно или два вмешательства одновременно.
Согласен, что данные ограничения только с большой натяжкой можно назвать защитой от SQL инъекций. Если пользователь наделен правом удаления таблиц, то и инъекция сможет сделать нечто похожее, однако она не будет способна делать что-либо другое. И не стоит наделять любого пользователя возможностью удалять таблицы.
Защита от SQL инъекций: Волшебные кавычки
Я думаю не лишним будет напомнить о том, что представляют из себя волшебные кавычки. "Волшебные Кавычки" (Magic Quotes) - это процесс, который автоматически экранирует входящие данные PHP скрипта. Он защищает РНР скрипт от внешних воздействий в ходе его выполнения.
Те, кто рекомендует фиксировать волшебные кавычки не имеют представления о том, что говорят. Ко всему прочему, их вообще решили убрать из версии РНР 6. Чем же вызвано такое враждебное отношение к волшебным кавычкам, которые на первый взгляд только способствуют защите от SQL инъекций?
Ответ краток: они плохо влияют на мобильность и производительность РНР скрипта, и вносят путаницу между данными, которые не нуждаются в экранировании. К тому же вот еще ряд недостатков:
- Многие скрипты, построенные при помощи Magic Quotes , не работают на серверах, которые не поддерживают данную возможность
- Выполнение скриптов теряет свою наглядность, так как не все данные вносятся в базу данных, отчего зря увеличивается время выполнения скрипта
- Magic Quotes очень неудобны. Они добавляют дополнительный слеш (”\”) ко всем формам данных, даже в тех случаях, когда в нем нет абсолютно никакой необходимости
Ну вот мы наконец-то подходим к главному в данной статье! Мы уже узнали, что: не следует использовать волшебные кавычки при написании скриптов; нужно найти альтернативные пути ввода информации, которые бы максимально затрудняли ввод вредоносных данных.
Защита от SQL инъекций: Способ избежать SQL атаки
Конечно, вы понимаете, что нет универсальной тактики, которая защитила бы ваш сайт абсолютно от всех SQL атак. Но все же есть ряд мер, применив которые можно существенно повысить шансы на отражение атаки. Ведь очень часто, не совсем добросовестные (ну или просто ленивые) и пренебрегают элементарными правилами безопасности.
Для борьбы с SQL инъекциями РНР разработчики придумали специальную функцию под названием mysql_real_escape_string(). Она используется следующим образом:
$name = "John";
$name = mysql_real_escape_string($name);
$SQL = "SELECT * FROM users WHERE username = '$name'";
$name = mysql_real_escape_string($_POST['user']);
В принципе, все выше описанные операции можно записать одной строкой:
$SQL = "SELECT * FROM users where username = "mysql_real_escape_string($POST['user']);
Так что же теперь ожидает пользователей, которые стремятся атаковать ваш SQL сервер? С радостью отвечаем вам, что они попросту зря потеряют время:
$malcious_input = "' OR 1'";
// Вводяться вредоносные данные
// С помощью mysql_real_escape_string() с вредоносными данными происходят изменения
\' OR 1\'
// Заметьте, что слеш заменил кавычки, тем самым сделав вредоносные данные неопасными
В заключение хочется заметить, что с помощью функции mysql_real_escape_string() можно застраховаться далеко не от всех случаев SQL атак, однако она надежно защищает ваши базы данных от наиболее распространенных атак. Так же вот две полезные ссылки : addons.mozilla.org/en-US/firefox/addon/6727 и addons.mozilla.org/en-US/firefox/addon/3899, по которым вы сможете найти ряд инструментов для FireFox, которые помогут вам протестировать свой сайт на предмет защиты от SQL инъекций.
От автора
В данной статье использовались материалы с англоязычного веб-ресурса, посвященного РНР разработчикам. С оригинальным текстом источника вы можете ознакомиться по адресу http://www.learnphponline.com/security/sql-injection-prevention-mysql-php. Если вам интересны веб-технологии и вы нашли толковую англоязычную статью, однако испытываете некоторые трудности с переводом, то можете обратиться к нам за помощью. Вы можете оставить ссылку на интересующую вас статью, а мы, если сочтем ее достойной внимания, в скором времени предоставим ее перевод. Заранее спасибо.





