Проект 1

Задача: создать приложение, которое будет инициализировать работу с базой данных, в функционале которого будет возможность создать запрос с защитой от т. н. SQL Injection, или, иначе говоря, с защитой от выполнения вредоносного кода.

Решение:

Шаг первый: проектируем логику приложения

Что нам понадобится для создания такого приложения? Можно, конечно, наплодить много функций, но логичнее всего это будет реализовать в виде класса. Назовем его Database. Все функции будем располагать в нём. Какие функции нам понадобятся? Начинам думать над проблемой. Задачу можно решить только в случае, если мы всё знаем о проблеме этой задачи. Начинаем копать.

Википедия:

Внедрение SQL-кода (англ. SQL injection) — один из распространённых способов взлома сайтов и программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL-кода.

Внедрение SQL, в зависимости от типа используемой СУБД и условий внедрения, может дать возможность атакующему выполнить произвольный запрос к базе данных (например, прочитать содержимое любых таблиц, удалить, изменить или добавить данные), получить возможность чтения и/или записи локальных файлов и выполнения произвольных команд на атакуемом сервере.

Атака типа внедрения SQL может быть возможна из-за некорректной обработки входных данных, используемых в SQL-запросах.

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

Копаем глубже:

Допустим, серверное ПО, получив входной параметр id, использует его для создания SQL-запроса. Рассмотрим следующий PHP-скрипт:

# Предыдущий код скрипта... $id = $_REQUEST['id'];$res = mysql_query("SELECT * FROM news WHERE id_news = $id "); # Следующий код скрипта...

Если на сервер передан параметр id, равный 5 (например так: http://example.org/script.php?id=5), то выполнится следующий SQL-запрос:

SELECT * FROM news WHERE id_news = 5

Но если злоумышленник передаст в качестве параметра id строку -1 OR 1=1 (например, так: http://example.org/script.php?id=-1+OR+1=1), то выполнится запрос:

SELECT * FROM news WHERE id_news = -1 OR 1=1

Таким образом, изменение входных параметров путём добавления в них конструкций языка SQL вызывает изменение в логике выполнения SQL-запроса (в данном примере вместо новости с заданным идентификатором будут выбраны все имеющиеся в базе новости, поскольку выражение 1=1 всегда истинно).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: