Давайте представим себе, что ваш запрос имеет следующий вид:
SELECT*FR0M subscribers WHERE id = '$id'
Все будет работать нормально до тех пор, пока в качестве значения переменной $id пользователь будет передавать число. Но что произойдет, если в качестве значения переменной пользователь передаст следующую строчку?
1’;DELETE FROM subscribers;--
Это значение попадет в код, и произойдет удаление всех строк из таблицы subscribers. Так в одно мгновение вы потеряете всех своих подписчиков!
Защита от этого вида взлома проста для понимания, но требует того, чтобы ее использовали всегда. Запомните правило: если в SQL-запросе вы используете переменные, значения которых получаете от пользователя, никогда не помещайте эти переменные напрямую в запрос! Вместо этого пользуйтесь тем методом, который описан ниже.
1. Поместите ваш запрос в переменную:
$t = “SELECT*FR0M subscribers WHERE id = '$id'”;
2. Вместо переменных, находящихся в запросе, вставьте следующие служебные символы: %s – для строки; %d – для целого числа; %f – для действительного числа.
$t = “SELECT*FR0M subscribers WHERE id = '%d'”;
3. Воспользуйтесь функцией sprintf().
sprint() – функция, которая возвращает отформатированную строку. Не будем вдаваться в подробности работы этой функции. Просто запомните, что в качестве первого параметра необходимо указать переменную, в которую мы помещали специально подготовленный запрос. В качестве следующих параметров переменные, которые мы хотим защитить – те, вместо которых мы в запрос помещали специальные символы со знаком процента. Причем эти переменные должны быть размещены в том порядке, в каком должны быть подставлены в запрос.
Вот как в итоге должен выглядеть код:

4. Если используемая переменная имеет строковое значение, примените функцию экранирования mysql_real_escape_string() следующим образом:

Полученную переменную $query теперь можно абсолютно безопасно использовать в качестве запроса к базе данных.
Еще один метод, который бы не мешало применить – это ограничить права MySQL-пользователя. Средствами phpMyAdmin вы можете ограничить права любого пользователя базы данных. То есть вы можете задать, какие операции пользователь имеет право выполнять под этой учетной записью, а какие нет. Например, вы можете предоставить пользователю право лишь получать данный из базы данных, и больше ничего. Естественно, при подключении к базе в скрипте необходимо будет указать уже данные именно этого пользователя. В таком случае MySQL будет сознательно игнорировать все запросы кроме тех, что осуществляют выборку из нее. А так как ваш скрипт может и не предполагать вывод результата выборки на экран, то злоумышленник вообще ничего не увидит. Подробно о том, как это делается, описано здесь - http://myrusakov.ru/...dmin-users.html.
Итак, никогда не доверяйте пользователям! Любые данные, которые вы получаете от них через форму или через get-запрос, и планируете поместить в свои SQL-запросы, ОБЯЗАТЕЛЬНО подвергайте обработке методом, описанным выше. Конечно, это требует от вас дополнительных усилий, написания дополнительного кода. Но со временем у вас выработается привычка формировать свои запросы к базам данных именно таким образом, и это сделает ваши сайты более безопасными.
В этой статье мы рассмотрели лишь один способ защиты своих проектов. Если вы серьезно займетесь PHP-программированием, то вам необходимо подробно изучить проблему безопасности, так как sql-инъекциями эта тема не исчерпывается, а только начинается. Для более глубокого изучения, рекомендую начать с книги «PHP глазами хакера».
Желаю успехов в дальнейшем освоении языка программирования PHP.
Все статьи этой серии:
- Вступление. Необходимый инструментарий. Первый скрипт
- Базовый синтаксист. Оператор echo
- Переменная. Константы
- Типы данных
- Операторы. Операции
- Ветвления
- Функции
- Область видимости переменных и время их жизни
- Циклы
- Массивы
- Предопределенные массивы. Функции для работы с массивами
- HTTP-запросы
- Формы. Работа с HTML-кодом
- Формы. Обработка средствами PHP
- Базы данных. SQL-запросы
- Базы данных. Работа с SQL средствами PHP
- Защита от SQL-инъекций
- Продолжение следует
Сообщение отредактировал GoodX: 04 Сентябрь 2012 - 02:38