SQL-инъекция. Внедрение SQL-кода. Называйте как хотите. Вроде бы такая древняя уязвимость, но сейчас ее можно встретить очень часто.
Wiley Web Application Hacker's Handbook утверждает, что SQL-инъекция встречается в 36% уязвимых веб-приложений. Не берусь проверять эту информацию, но стоит признать, что будь это число в три раза меньше, это все равно бы осталось проблемой.
Что такое SQL-инъекция?
SQL-инъекция (внедрение SQL-кода) - способ взлома сайтов, программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL-кода.
Иными словами, из-за некорректной обработки вводных данных мы можем составить такой запрос, который позволит нам прочитать содержимое любых таблиц (например, users), добавить новую таблицу либо удалить существующую. Это далеко не все возможности SQL-инъекции, но и их достаточно, чтобы оценить опасность.
Как это выглядит?
Часть информации взята с Википедии, там очень наглядный пример, потому и будем его использовать:
Как с этим бороться?
Предвижу, что многие скажут следующее: "Это элементарно, я знаю это уже давно". Но несмотря на это, всегда находятся умники, которые, даже зная о SQL-инъекции, о ее опасности, забывают предотвратить ее возможность.
Итак, вот способы борьбы с SQL-инъекцией:
Wiley Web Application Hacker's Handbook утверждает, что SQL-инъекция встречается в 36% уязвимых веб-приложений. Не берусь проверять эту информацию, но стоит признать, что будь это число в три раза меньше, это все равно бы осталось проблемой.
Что такое SQL-инъекция?
SQL-инъекция (внедрение SQL-кода) - способ взлома сайтов, программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL-кода.
Иными словами, из-за некорректной обработки вводных данных мы можем составить такой запрос, который позволит нам прочитать содержимое любых таблиц (например, users), добавить новую таблицу либо удалить существующую. Это далеко не все возможности SQL-инъекции, но и их достаточно, чтобы оценить опасность.
Как это выглядит?
Часть информации взята с Википедии, там очень наглядный пример, потому и будем его использовать:
Сервер создает SQL запрос на основе параметра id (допустим, номер страницы, номер новости, и т.д.). Пусть обрабатывать это будет такой РНР-скрипт:
# Предыдущий код скрипта... $id = $_REQUEST['id']; $res = mysql_query("SELECT * FROM table WHERE id = $id"); # Следующий код скрипта...
Когда передается id, равный числу (обычный запрос), (script.php?id=10), составляется SQL запрос:
SELECT * FROM table WHERE id = 10
Некто передает в качестве параметра id строку -1 OR 1=1 (script.php?id=-1+OR+1=1).
Запрос видоизменится:
Запрос видоизменится:
SELECT * FROM table WHERE id = -1 OR 1=1
Значит, мы можем изменять запрос таким образом, что логика выполнения запроса изменится тоже. Например, классический случай: в поле Login вводится строка, из-за которой не происходит проверка пароля, так как эта часть отбрасывается в комментарий, а происходит проверка на истинность заведомо истинного события, то же сравнение 1=1.
Предвижу, что многие скажут следующее: "Это элементарно, я знаю это уже давно". Но несмотря на это, всегда находятся умники, которые, даже зная о SQL-инъекции, о ее опасности, забывают предотвратить ее возможность.
Итак, вот способы борьбы с SQL-инъекцией:
- Берем в кавычки все текстовые параметры. В параметре экранируем спецсимволы.
- Проверяем численные параметры, если не число - не выполняем.
- Если известна максимальная длина параметра (к примеру, максимальный id=37, два символа), то из всего введенного параметра оставляем некое разрешенное число символов слева (в нашем примере - 2 символа слева). Трудновато провести инъекцию, используя 2 символа, особенно, если они заняты.
- Многие сервера баз данных поддерживают возможность отправки параметризованных запросов. При этом параметры внешнего происхождения отправляются на сервер отдельно от самого запроса либо автоматически экранируются клиентской библиотекой.
Простые истины.
ОтветитьУдалитьНо кому то может пригодится.