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