Поиск по этому блогу

воскресенье, 13 февраля 2011 г.

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-инъекцией:

  1. Берем в кавычки все текстовые параметры. В параметре экранируем спецсимволы.
  2. Проверяем численные параметры, если не число - не выполняем.
  3. Если известна максимальная длина параметра (к примеру, максимальный id=37, два символа), то из всего введенного параметра оставляем некое разрешенное число символов слева (в нашем примере - 2 символа слева). Трудновато провести инъекцию, используя 2 символа, особенно, если они заняты.
  4. Многие сервера баз данных поддерживают возможность отправки параметризованных запросов. При этом параметры внешнего происхождения отправляются на сервер отдельно от самого запроса либо автоматически экранируются клиентской библиотекой.

1 комментарий: