Руководство по SQL. Инъекции.

Зачастую, записи в таблицу базы данных (далее – БД) добавляются из формы (например, веб-страницы). И есть шанс того, что наше приложение будет крайне уязвимо для SQL инъекции.

В данной статье мы рассмотри способ уменьшения уязвимости и как сделать скрипты и запросы безопасными.

Обычно, инъекции происходят, когда мы просим пользователя ввести какие-либо данные (например, email, имя, телефон и т.д.). Но, вместо этих данных пользователь может ввести SQL запрос, который будет выполнения в нашей БД.

Мы никогда не должны доверять данным, которые поступают со стороны пользователя и обрабатывать их мы можем только после валидации.

Пример:

В данном примере, имя пользователя ограничено числами и буквами, а длина имени должна быть не менее 3-х символов, но не более 50:


if (preg_match("/^\w{3,50}$/", $_GET['username'], $matches))
{
   $result = mysql_query("SELECT * FROM developers 
                          WHERE name=$matches[0]");
}
else 
{
   echo "user name not accepted";
}

Теперь, если кто-либо захочет выполнить следующий запрос:


$name = "Eugene'; DELETE FROM developers;";
mysql_query("SELECT * FROM developers WHERE name='{$name}'");

Целью введённых данных было удаление записей из таблицы developers. Но, MySQL запрещает выполнение нескольких запросов в одном вызове функции.
Но, такая RDBMS, как POstgreSQL разрешает подобные операции, в результате чего, возможно удаление данных из БД.

Для предотвращения подобных запросов, используется следующий скрипт:


if (get_magic_quotes_gpc()) 
{
  $name = stripslashes($name);
}
$name = mysql_real_escape_string($name);
mysql_query("SELECT * FROM developers WHERE name='{$name}'")

На этом мы заканчиваем изучение инъекций в языке SQL.

Мы также завершаем цикл статей, посвящённых изучению языка структурированных запросов SQL.