Перейти к содержимому

Фотография

Изучаем основы PHP. Защита от SQL-инъекций

php программирование sql

  • Авторизуйтесь для ответа в теме
В этой теме нет ответов

#1 GoodX

GoodX

    Свой человек

  • Клиент Info-DVD.Ru
  • PipPipPipPipPip
  • 533 сообщений
  • Пол:Мужчина

Отправлено 04 Сентябрь 2012 - 02:28

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

Давайте представим себе, что ваш запрос имеет следующий вид:

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() – функция, которая возвращает отформатированную строку. Не будем вдаваться в подробности работы этой функции. Просто запомните, что в качестве первого параметра необходимо указать переменную, в которую мы помещали специально подготовленный запрос. В качестве следующих параметров переменные, которые мы хотим защитить – те, вместо которых мы в запрос помещали специальные символы со знаком процента. Причем эти переменные должны быть размещены в том порядке, в каком должны быть подставлены в запрос.
Вот как в итоге должен выглядеть код:

42.png

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

43.png

Полученную переменную $query теперь можно абсолютно безопасно использовать в качестве запроса к базе данных.

Еще один метод, который бы не мешало применить – это ограничить права MySQL-пользователя. Средствами phpMyAdmin вы можете ограничить права любого пользователя базы данных. То есть вы можете задать, какие операции пользователь имеет право выполнять под этой учетной записью, а какие нет. Например, вы можете предоставить пользователю право лишь получать данный из базы данных, и больше ничего. Естественно, при подключении к базе в скрипте необходимо будет указать уже данные именно этого пользователя. В таком случае MySQL будет сознательно игнорировать все запросы кроме тех, что осуществляют выборку из нее. А так как ваш скрипт может и не предполагать вывод результата выборки на экран, то злоумышленник вообще ничего не увидит. Подробно о том, как это делается, описано здесь - http://myrusakov.ru/...dmin-users.html.

Итак, никогда не доверяйте пользователям! Любые данные, которые вы получаете от них через форму или через get-запрос, и планируете поместить в свои SQL-запросы, ОБЯЗАТЕЛЬНО подвергайте обработке методом, описанным выше. Конечно, это требует от вас дополнительных усилий, написания дополнительного кода. Но со временем у вас выработается привычка формировать свои запросы к базам данных именно таким образом, и это сделает ваши сайты более безопасными.

В этой статье мы рассмотрели лишь один способ защиты своих проектов. Если вы серьезно займетесь PHP-программированием, то вам необходимо подробно изучить проблему безопасности, так как sql-инъекциями эта тема не исчерпывается, а только начинается. Для более глубокого изучения, рекомендую начать с книги «PHP глазами хакера».

Желаю успехов в дальнейшем освоении языка программирования PHP.

Все статьи этой серии:

Сообщение отредактировал GoodX: 04 Сентябрь 2012 - 02:38

  • 0



Темы с аналогичным тегами php, программирование, sql

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых пользователей