Безопасность — не фича, которую добавляют в конце
«Безопасность добавим потом» — одна из самых дорогих фраз в разработке. Большинство уязвимостей — не следствие атак сложных хакеров, а результат предсказуемых и хорошо известных ошибок разработки. OWASP (Open Web Application Security Project) публикует Top 10 самых критичных уязвимостей. Они не меняются кардинально год от года, потому что разработчики продолжают их допускать. Знать их — это базовая профессиональная грамотность.
OWASP Top 10: что важно знать
Инъекции (SQL, Command, LDAP)
Пользовательский ввод попадает напрямую в запрос без санитизации. SQL-инъекция позволяет атакующему читать, изменять или удалять данные в базе. Защита: параметризованные запросы (Prepared Statements) всегда, ORM с правильным использованием, никогда не конкатенировать пользовательский ввод в SQL-строку.
Сломанная аутентификация
Слабые пароли, отсутствие rate limiting на login-endpoint, небезопасное хранение сессий, предсказуемые токены. Защита: bcrypt/argon2 для хеширования паролей, rate limiting на аутентификацию, двухфакторная аутентификация для чувствительных операций, корректная инвалидация сессий при logout.
Нарушение контроля доступа
Пользователь может получить доступ к данным другого пользователя, изменив ID в URL. Защита: проверка прав доступа на уровне API для каждого запроса, не только на уровне интерфейса. Авторизация должна быть server-side, не client-side.
Небезопасная конфигурация
Дефолтные пароли, открытые debug-режимы на production, неправильно настроенные CORS, избыточные права у базы данных. Защита: отдельные конфигурации для dev/staging/production, секреты в переменных окружения (не в коде), принцип минимальных привилегий для всех компонентов.
XSS (Cross-Site Scripting)
Атакующий внедряет JavaScript в страницу, который выполняется в браузере жертвы. Защита: экранирование всего пользовательского контента при выводе, Content Security Policy (CSP) в заголовках, использование современных фреймворков (React, Vue), которые экранируют по умолчанию.
Уязвимые зависимости
Используемые библиотеки и пакеты содержат известные уязвимости. Защита: регулярное обновление зависимостей, использование npm audit / composer audit / Dependabot для автоматического отслеживания уязвимостей.
Security by Design: как строить безопасно с первого дня
- Threat Modeling: при проектировании задайте вопрос «что может пойти не так?» для каждого модуля.
- Input Validation: валидировать все входящие данные на сервере, не только на клиенте.
- Least Privilege: каждый компонент имеет только те права, которые необходимы.
- Логирование подозрительной активности: множественные неудачные login, аномальные объёмы запросов.
Вывод
Большинство взломов происходят через предсказуемые уязвимости, которые описаны в OWASP уже много лет. Знание и применение базовых практик безопасности закрывает 80% рисков. Это не rocket science — это дисциплина. Закладывайте безопасность в архитектуру с первого дня, а не добавляйте поверх готового продукта.