Топ-10 уязвимостей в веб‑разработке обычно сводится к инъекциям (SQL/XSS), слабой аутентификации, ошибкам контроля доступа, утечкам секретов, небезопасной криптографии, проблемам в цепочке поставок и неверной конфигурации. Ниже - практичная инструкция: как распознавать симптомы, что автоматизировать в CI/CD, какие проверки добавить в код‑ревью и как закрывать риски с минимальными усилиями.
Короткий обзор наиболее критичных рисков
- SQL-инъекции из-за конкатенации строк в запросах и динамических фильтров.
- Захват сессий/токенов из-за слабых cookie‑атрибутов, неверного TTL и отсутствия ротации.
- XSS (stored/reflected/DOM) при выводе непроверенных данных и небезопасных шаблонизаторах.
- Broken Access Control: IDOR, перепутанные роли, отсутствие проверок на уровне доменных правил.
- Supply chain: компрометированные пакеты, лишние права CI, неблокированные версии зависимостей.
- Секреты в репозитории и логах, слабая криптография и некорректное управление ключами.
SQL-инъекции: механика, примеры эксплуатации и проверенные контрмеры
Кому подходит: командам, где есть SQL (PostgreSQL/MySQL/MSSQL), динамические фильтры, отчёты, админки, импорт/экспорт, а также ручные запросы в коде и миграциях.
Когда не стоит делать самостоятельно: если вы планируете активно эксплуатировать подозрительные места в проде или нет тестового контура/разрешения на проверку - в таком случае безопаснее пентест веб приложения заказать у подрядчика с согласованным scope и правилами.
Минимальный пример уязвимости и безопасная замена
// ПЛОХО: конкатенация строки
const q = "SELECT * FROM users WHERE email = '" + email + "'";
// ХОРОШО: параметризация
const q = "SELECT * FROM users WHERE email = ?";
db.query(q, [email]);
Контрмеры по приоритету
- Параметризованные запросы везде. Исключите ручную сборку SQL; если нужен динамический WHERE/ORDER BY - используйте безопасные билдеры, белые списки полей и направление сортировки.
- Белые списки для идентификаторов. Таблицы/колонки/ORDER BY нельзя параметризовать обычным способом - делайте маппинг допустимых значений.
- Минимальные права БД. Отдельные учётки на чтение/запись; запрет опасных возможностей там, где не нужно (например, расширения, доступ к файловой системе, админские функции).
- Единая библиотека доступа к данным. Сведите ручной SQL к минимуму и запретите небезопасные методы линтером/ревью.
Быстрая проверка в CI
- SAST: включите правила на строковую конкатенацию запросов и небезопасные API драйвера/ORM.
- DAST на тестовом стенде: прогоняйте сканер по критичным эндпойнтам после деплоя в staging.
Проблемы аутентификации и сессий: от слабых паролей до захвата токенов
Что понадобится: доступ к настройкам cookie/headers, конфигурации IdP/SSO (если есть), логам входа, настройкам rate limit/WAF, а также тестовый аккаунт разных ролей (user/admin/support). Полезно иметь Burp Suite/ZAP, Postman/curl, и возможность деплоя в staging.
Что проверить в первую очередь
- Пароли и brute force: rate limit, lockout/step-up, запрет распространённых паролей, MFA там, где риск высокий.
- Сессии и токены: короткий TTL для access, refresh с ротацией, привязка к устройству/контексту (аккуратно), отзыв при смене пароля.
- Cookie: Secure, HttpOnly, SameSite (обычно Lax/Strict по контексту), корректный Path/Domain.
- OAuth/OIDC: PKCE для публичных клиентов, строгая проверка redirect_uri, audience/issuer, защита от replay.
Команды для экспресс-диагностики
# Посмотреть Set-Cookie и флаги
curl -I https://example.com/login
# Проверить, не принимает ли API токен в query string (плохо)
curl -i "https://example.com/api/me?token=..."
XSS и инъекции в браузере: виды, последствия и защита на уровне фронта и бэка
Ограничения и риски перед внедрением мер:
- Жёсткая CSP может сломать аналитику, виджеты и legacy‑скрипты - включайте постепенно и с режимом report-only.
- Автоэкранирование в шаблонизаторе легко отключить локально - запретите unsafe-паттерны линтером и ревью.
- Санитизация HTML без понимания контекста (HTML/URL/JS/CSS) даёт ложное чувство безопасности.
- Проверки на клиенте не заменяют серверные: злоумышленник всегда может отправить запрос напрямую.
-
Классифицируйте точки ввода и контексты вывода.
Опишите, какие данные приходят от пользователя/интеграций и куда попадают: HTML, атрибуты, URL, JS-строки, CSS. Для каждого контекста нужны разные правила экранирования.- Запретите небезопасные sinks:
innerHTML,document.write,eval, конкатенацию в обработчики событий.
- Запретите небезопасные sinks:
-
Включите автоэкранирование и используйте безопасные API.
На фронте предпочитайтеtextContentвместоinnerHTML; на бэке используйте шаблонизатор с auto-escape по умолчанию.- Если нужно выводить HTML (комментарии, описания) - санитизируйте строго разрешёнными тегами/атрибутами.
-
Санитизируйте только там, где это действительно нужно.
Не смешивайте валидацию (что допустимо) и кодирование вывода (как безопасно отрендерить). Санитизация уместна для ограниченного HTML, который вы решили поддержать. -
Добавьте CSP и защитные заголовки.
Начните сContent-Security-Policy-Report-Only, соберите отчёты, затем ужесточайте. ДополнитеX-Content-Type-Options: nosniffи корректной политикой реферера.- Для современных приложений: nonce/sha для скриптов, запрет
unsafe-inlineтам, где возможно.
- Для современных приложений: nonce/sha для скриптов, запрет
-
Автоматизируйте поиск XSS в CI и регрессию.
Подключите SAST (поиск опасных sinks/sources), unit/интеграционные тесты на экранирование, DAST на staging по ключевым пользовательским сценариям.
Ошибка контроля доступа и утечка привилегий: как проектировать безопасные границы
- Единый enforcement на сервере: проверки прав должны жить в middleware/guard и в доменной логике (на уровне операции), а не только в UI.
- Запрет IDOR по умолчанию: любой доступ к объекту требует проверки владения/роли/политики, даже если ID кажется непредсказуемым.
- Разделяйте роли и действия: права на чтение, изменение, удаление и админ-действия - отдельные capability.
Чек-лист проверки результата (перед релизом)
- Для каждого эндпойнта определены: актор, ресурс, действие, политика (кто и при каких условиях может).
- Проверки прав выполняются сервером даже при прямом вызове API без UI.
- Нельзя получить доступ к чужим объектам заменой ID в URL/теле запроса.
- Админские операции недоступны обычным ролям даже при подмене параметров.
- Ошибки авторизации не раскрывают лишние детали (нет утечки существования объектов по разным ответам).
- Логи фиксируют попытки доступа: кто, что, к чему, результат (без секретов).
- Тесты включают негативные кейсы: пользователь A пытается читать/менять данные пользователя B.
- Есть защита от массового назначения полей (mass assignment): разрешённые поля определены явно.
Уязвимости в цепочке поставок: пакеты, CI/CD и безопасное управление зависимостями
Если команда регулярно обновляет зависимости, но не контролирует источники и права сборки, риск компрометации растёт. На практике это часто всплывает после запроса на анализ уязвимостей кода заказать или при инциденте в CI.
Частые ошибки, которые нужно убрать
- Нет lock-файла или он не фиксирует транзитивные версии.
- Разрешены широкие диапазоны версий (например, caret/tilde без контроля обновлений в проде).
- Сборка тянет зависимости из непроверенных реестров/прокси без политики allowlist.
- В CI доступны секреты всем веткам/PR, включая форки.
- Нет подписи артефактов и проверок целостности (хеши/аттестации) на пути к деплою.
- Отсутствует SBOM и процесс реакции на уязвимости зависимостей (triage, обновление, backport).
- Runner/агент CI имеет лишние права в облаке/кластере (можно читать секреты, управлять инфраструктурой).
- Используются устаревшие базовые образы контейнеров и не настроено регулярное пересборивание.
Практичные настройки для CI/CD
- SCA-сканирование зависимостей: запускайте на каждом PR + nightly; падайте сборкой на критичных проблемах по вашей политике.
- Сканирование контейнеров: проверяйте image на уязвимости перед публикацией в registry.
- Права по минимуму: отдельные токены/роли для сборки, деплоя и чтения; секреты только для доверенных веток.
- Проверка секретов: pre-commit и CI-проверка на утечки ключей (git history тоже).
Криптография и управление секретами: выбор алгоритмов, хранение и ротация ключей

Ошибки здесь обычно не в выборе конкретного алгоритма, а в ключах: где лежат, кто читает, как ротируются, как попадают в логи и дампы.
Варианты подходов и когда они уместны
- KMS/Secrets Manager (облако или on-prem). Подходит для большинства сервисов: централизованное хранение, аудит доступа, ротация; приложение получает секреты по короткоживущим кредам.
- Vault-подобный подход с динамическими секретами. Уместно, когда нужно выдавать временные учётки к БД/очередям и автоматически отзывать их; снижает ущерб от утечек.
- HSM/аппаратное хранение ключей. Для высоких требований (платёжные/регулируемые контуры), когда критично, чтобы приватный ключ не покидал защищённый модуль.
- Шифрование на стороне приложения + envelope encryption. Полезно для защиты данных в БД/бэкапах: данные шифруются DEK, а DEK оборачивается ключом из KMS.
Итоговая приоритизация: уязвимость → риск → быстрые меры
| Уязвимость (из топ-10) | Риск | Усилия | Короткий чек‑лист мер |
|---|---|---|---|
| SQL-инъекции | High | Medium |
|
| XSS (stored/reflected/DOM) | High | Medium |
|
| Broken Access Control (IDOR, роль/объект) | High | Medium |
|
| Аутентификация и сессии | High | Low/Medium |
|
| Утечки секретов (репозиторий/логи/CI) | High | Low |
|
| Supply chain (зависимости/артефакты) | High | Medium |
|
| Неверная конфигурация (headers, debug, CORS) | Medium/High | Low |
|
| CSRF (где cookie‑сессии) | Medium | Low |
|
| Небезопасная десериализация/инъекции команд | High | Medium |
|
| Недостаточное логирование и мониторинг | Medium | Medium |
|
Ответы на частые практические запросы разработчиков по защите
Какие курсы кибербезопасности для разработчиков реально помогают в работе?
Ищите программы с практикой: threat modeling, secure code review, лабораторные по OWASP Top 10, настройка SAST/DAST/SCA в CI. Полезнее те, где вы внедряете изменения в свой репозиторий и получаете ревью.
Как организовать обучение безопасной разработке secure coding внутри команды без перегруза?
Делайте короткие модули под ваши технологии и добавляйте правила в линтер/CI, чтобы знания закреплялись автоматически. Начните с двух тем: инъекции и контроль доступа, затем - секреты и цепочка поставок.
От чего обычно зависит аудит безопасности веб приложения цена?

От объёма (число модулей/эндпойнтов), наличия исходников, типа тестирования (black/grey/white box), требований к отчёту и ретесту. Чем лучше подготовлен staging и тестовые роли, тем меньше времени уходит на организацию и тем выше полезность результатов.
Что подготовить, если решили пентест веб приложения заказать?

Определите scope, тестовый контур, окна времени, список ролей, критерии критичности и контакт для эскалации. Обязательно согласуйте правила: что нельзя трогать (например, платежи) и как фиксировать найденное.
Когда имеет смысл анализ уязвимостей кода заказать, а не настраивать всё самим?
Когда мало компетенций в secure review, много легаси и нужно быстро получить карту рисков и план исправлений. Это также полезно перед внешним релизом, сертификацией или миграцией на новую архитектуру.
Какие три настройки дают максимум эффекта за неделю?
Параметризация SQL и запрет опасных паттернов в ревью, включение secret scanning + SCA в CI, и базовые защиты сессий (Secure/HttpOnly/SameSite, TTL, ротация). Эти меры быстро режут самые частые классы атак.
Как понять, что CSP можно включать в enforce, а не только report-only?
Когда отчёты стабильны, вы устранили легитимные inline-скрипты/стили или перевели их на nonce/sha, и покрыли основные пользовательские потоки. Перед enforce зафиксируйте политику и добавьте регрессионные тесты на ключевые страницы.



