Настройка защиты от SQL-инъекций на сайте

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.
Разработка и обслуживание любых видов сайтов:
Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Настройка защиты от SQL-инъекций на сайте
Средняя
от 1 рабочего дня до 3 рабочих дней
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1214
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    852
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1041
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    823
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    815

Настройка защиты от SQL-инъекций на сайте

SQL-инъекция — атака, при которой злоумышленник встраивает произвольный SQL-код в запросы приложения. Результат: утечка всей базы данных, обход авторизации, изменение или удаление данных. По статистике OWASP, это стабильно входит в тройку самых критичных веб-уязвимостей.

Основная причина уязвимости

Прямая конкатенация пользовательского ввода в SQL:

// УЯЗВИМО
$query = "SELECT * FROM users WHERE email = '" . $_POST['email'] . "'";

// Ввод атакующего: ' OR '1'='1
// Результат: SELECT * FROM users WHERE email = '' OR '1'='1'
// Возвращает всех пользователей

Подготовленные запросы (Prepared Statements)

Единственный надёжный способ — параметризованные запросы. Значения никогда не интерполируются в SQL-строку:

PDO (PHP):

$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ? AND active = ?');
$stmt->execute([$email, 1]);
$user = $stmt->fetch();

Eloquent ORM (Laravel):

// Все методы ORM используют подготовленные запросы автоматически
$user = User::where('email', $email)->where('active', true)->first();

// Если нужен сырой SQL — bindParam обязателен
$users = DB::select('SELECT * FROM users WHERE email = ?', [$email]);

Sequelize (Node.js):

const user = await User.findOne({ where: { email, active: true } });

// Сырой запрос
const [results] = await sequelize.query(
    'SELECT * FROM users WHERE email = :email',
    { replacements: { email }, type: QueryTypes.SELECT }
);

ORM — не гарантия безопасности

Некоторые методы ORM принимают сырые фрагменты и уязвимы:

// Laravel — ОПАСНО
User::whereRaw("name = '$name'")->get();
User::orderBy($request->get('sort'))->get(); // уязвима к ORDER BY injection

// БЕЗОПАСНО
User::whereRaw('name = ?', [$name])->get();
$allowedSorts = ['name', 'email', 'created_at'];
$sort = in_array($request->sort, $allowedSorts) ? $request->sort : 'name';
User::orderBy($sort)->get();

Валидация и whitelist для динамических частей

Параметры запроса, которые нельзя параметризовать (имена таблиц, столбцов, направление сортировки), проверяют по whitelist:

$allowedColumns = ['title', 'created_at', 'views'];
$allowedDirections = ['asc', 'desc'];

$column = in_array($request->column, $allowedColumns)
    ? $request->column
    : throw new InvalidArgumentException('Invalid column');

$direction = in_array($request->direction, $allowedDirections)
    ? $request->direction
    : 'asc';

Принцип минимальных привилегий

Пользователь базы данных, от имени которого работает приложение, должен иметь только необходимые права:

-- Создать пользователя только с нужными правами
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'app_user'@'localhost';
-- Без DROP, CREATE, ALTER, GRANT

Даже при успешной инъекции атакующий не сможет дропнуть таблицы или создать новые.

WAF как дополнительный слой

Web Application Firewall (ModSecurity, Cloudflare WAF) перехватывает типичные SQL-инъекции на уровне HTTP до того, как запрос достигает приложения. Не замена подготовленным запросам — дополнительный барьер.

Сканирование уязвимостей

# sqlmap — автоматический поиск SQL-инъекций
sqlmap -u "https://example.com/search?q=test" --dbs --batch

# Для POST-запросов
sqlmap -u "https://example.com/login" --data="email=test&password=test" --dbs

Запускать только на собственных системах или при наличии письменного разрешения.

Хранимые процедуры

Хранимые процедуры не дают автоматической защиты, если внутри них конкатенируют строки:

-- УЯЗВИМО
CREATE PROCEDURE GetUser(IN userInput VARCHAR(255))
BEGIN
    SET @sql = CONCAT('SELECT * FROM users WHERE name = ''', userInput, '''');
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
END;

-- БЕЗОПАСНО — использовать параметризованные запросы внутри процедур

Аудит кода

При работе с legacy-проектом ищем паттерны:

# Поиск потенциально опасных конструкций в PHP
grep -rn 'query.*\$_\(GET\|POST\|REQUEST\)' src/
grep -rn 'whereRaw.*\.' app/
grep -rn '"SELECT.*".*\.' src/

Срок реализации

  • Аудит существующего кода: 1–3 дня в зависимости от объёма
  • Исправление уязвимых запросов: 2–7 дней
  • Настройка WAF + мониторинга: 1 день