3 простых правила о том, как защитить свой PHP код от SQL-инъекций

Осознанно или нет, но даже авторизованные пользователи Вашей системы могут попытаться каким-то образом эксплуатировать уязвимость SQL, поэтому нужно проверять абсолютно все данные, которые пользователь передаёт в систему.

#1 - Пользователь всегда хочет обмануть Вашу систему

Просто помните это и всегда держите в голове.

Прежде всего данные лучше передавать через POST, потому как GET запросы легко отследить в логах web-сервера, потенциально это опасно.

Никогда не используйте прямые пути до исполняемых php-файлов, старайтесь использовать $_SERVER['REQUEST_URI'] в комбинации с белыми списками допустимых URL, в простых проектах данный примитивные роутинг должен быть неплохой заменой полноценному роутингу унифицированных фреймворков.

#2 - Очищайте все данные, которые приходят в скрипт

Вам нужен белый список ключей, которые Вы передаёте через POST, ни в коем случае не создавайте переменные на лету из тех ключей, которые прислал пользователь.

Очищайте все данные, которые имеются внутри разрешённых ключей, например через preg_replace, удаляйте все символы, которые могут повредить системе. Вот пример того как я реализовал метод очистки данных.

На всякий случай, перед тем как писать данные в базу, очищенные данные преобразовывайте при помощи htmlspecialchars(). Мало ли какая уязвимость обнаружится в базе в будущем, нужно быть заранее готовым.

#3 - Передавайте данные в запрос только через хитрые PDO переменные

Из названия правила так же следует и то, что нужно использовать класс PDO вместо mysql или mysqli.

Ниже самая простейшая реализация работы с назначаемыми параметрами (binded parameters):

$username = $_POST['username'];
$statement = $db->prepare('SELECT * FROM `users` WHERE `username` = :username');
$statement->bindParam(":username", $username);
$statement->execute();

Не забывайте, что любую переменную, пришедшую в скрипт нужно очистить.

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

Вот пример реализации этой концепции в DrMVC.

2 thoughts on “3 простых правила о том, как защитить свой PHP код от SQL-инъекций

Comments are closed.