SELECT * FROM Vzakladke.net

Статьи об автоматизации и программировании


Отлавливаем в POST запросах наличие sql-inject на PHP

 

 

Поиск SQL injection

Как Вы уже поняли, инъекция появляется из входящих данных, которые не фильтруются. Самая распространенная ошибка — это не фильтрация передаваемого ID. Ну грубо говоря подставлять во все поля кавычки. Будь это GET/POST запрос и даже Cookie!

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

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

Атака типа внедрения SQL может быть возможна из-за некорректной обработки входных данных, используемых в SQL-запросах - если не экранировать входящие данные (например используя функцию escape для строковых значений или intval для целочисленных значений).

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

 

Простая фильтрация форм на php:

 

function escape_inj ($text) {
  $text = strtolower($text); // Приравниваем текст параметра к нижнему регистру
  if (
  !strpos($text, "select") && //
  !strpos($text, "union") && //
  !strpos($text, "select") && //
  !strpos($text, "order") && // Ищем вхождение слов в параметре
  !strpos($text, "where") && //
  !strpos($text, "char") && //
  !strpos($text, "from") //
  ) {
  return true; // Вхождений нету - возвращаем true
  } else {
  return false; // Вхождения есть - возвращаем false
  }
}
$section = $_ GET[section]; // Читаем параметр
if (!escape_inj ($section)) { // Проверяем параметр
  echo "Это SQL-инъекция.";
  exit ();
} else {
  $result = mysql_query ("SELECT * FROM `tbl_name` WHERE `section` = $section ");
  ... // Продолжаем работу
}

 

Дата публикации: 2015-04-17 01:59:53

PHP, MySQL

1

Отзывы:

Диман
А может проще перебрать весь массив глобальных переменных: foreach($_ GET as $query_string => $section) { if (!escape_inj ($section)) { exit ("Это SQL-инъекция."); } } или даже не _GET, _REQUEST вообще. Ваше мнение?
Виктор Королев
Подключаем .htaccess Чтобы закрыть список файлов и папок, добавляем: Options +FollowSymLinks -Indexes RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR] заблокирует ссылки, содержащие кодировку Base64. Избавиться от ссылок, содержащих тег <script>: RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR] Противодействовать скриптам, пытающимся установить глобальные переменные или изменить переменную _REQUEST через URL: RewriteCond %{QUERY_STRING} GLOBALS (=|\[|\%[0-9A-Z]{0,2}) [OR] RewriteCond %{QUERY_STRING} _REQUEST (=|\[|\%[0-9A-Z]{0,2}) Для противодействия SQL-инъекциям блокируем запросы к URL, содержащие определенные ключевые слова: RewriteCond %{query_string} concat.*\( [NC,OR] RewriteCond %{query_string} union.*select.*\( [NC,OR] RewriteCond %{query_string} union.*all.*select [NC] RewriteRule ^(.*)$ index.php [F,L] Чтобы испортить жизнь распространенным хакерским утилитам, отфильтровываем определенные user-agent’ы: SetEnvIf user-agent «Indy Library» stayout=1 SetEnvIf user-agent «libwww-perl» stayout=1 SetEnvIf user-agent «Wget» stayout=1 deny from env=stayout
Василий Пупкин
Шел 2015 год...
Виктор Королев
Может все таки 2016? С помощью этой функции во всяком случае можно не просто отразить атаку как за счет mysql_real_escape_string, но и отловить попытку внедрения инъекции.

Ваше имя:

Ваш e-mail (необязательно):

Сообщение:

Captcha