Комплексная защита веб-приложений: как устранить распространённые ошибки разработчиков и обезопасить данные

Изображение: Christin Hume (unsplash)
Веб-приложения постоянно усложняются, становится всё шире их функционал, включая взаимодействие с большим количеством данных, API и сторонними сервисами. Из-за их комплексности увеличивается поверхность атаки, вследствие чего сами приложения становятся более уязвимыми. К тому же развиваются и кибератаки, появляются всё новые методы и инструменты взлома систем и устройств. Для обеспечения высокого уровня защиты приложений разработчики должны быть в курсе последних угроз и постоянно адаптировать свои стратегии защиты. Веб-приложения хранят и обрабатывают огромное число конфиденциальных данных, что делает их привлекательной целью для киберпреступников. А утечка или компрометация данных может привести к крайне серьезным последствиям.
Мы составили список самых распространённых ошибок разработчиков и объяснили, как их устранить или избежать. Начнём с тех, которые наиболее актуальны для нас сегодня:
I. SQL-инъекции
В отношении SQL-инъекций наиболее часто встречаются две ошибки: прямая вставка пользовательских данных в SQL-запросы и отсутствие экранирования специальных символов.
Для того, чтобы устранить их, необходимо использовать подготовленные выражения (prepared statements) и применять ORM, выполнять параметризованные запросы и осуществлять систематическую проверку типов входных данных.
II. Cross-Site Scripting
В области XSS (Cross-Site Scripting) у разработчиков может не быть фильтрации пользовательского ввода. Другая проблема – прямой вывод непроверенных данных.
Этих ошибок можно избежать благодаря экранированию специальных символов, валидации входных данных и использованию специальных библиотек для очистки данных и Content Security Policy (CSP).
III. CSRF (Cross-Site Request Forgery)
Основные ошибки здесь – это отсутствие проверки источника запроса и недостаточная защита форм.
Устранить эти проблемы можно благодаря следующим мерам: использованию CSRF-токенов, SameSite Cookies и Double Submit Cookie, а также проверки заголовка Referer.
IV. Управление сессиями
В рамках аспекта управления сессиями наиболее часто встречаются две важные проблемы, а именно: небезопасная передача session ID и отсутствие таймаута сессий.
Здесь критически важно использовать secure- и httpOnly-флаги для cookies, осуществлять регенерацию session ID после авторизации и проводить настройку таймаута сессий.
V. FileUpload уязвимости
В случае, если при разработке не соблюдаются требования по безопасному хранению загруженных файлов, а также не проводится проверка типов файлов, могут возникнуть уязвимости FileUpload.
Что можно предпринять для ликвидации этих ошибок? Прежде всего, придерживаться принципов валидации типов и генерации случайных имён файлов. К тому же, следует проверять все загружаемые файлы на вредоносный код.
Проблемы могут возникнуть и на самом базовом уровне разработки – здесь всё зависит от специалиста и качества его работы. Тем не менее, приведём несколько примеров самых «примитивных» ошибок, с которыми нужно уметь справляться:
- Хранение паролей
Хранение паролей в открытом виде само по себе является грубой и опасной ошибкой. Может получиться и так, что при разработке используются слабые алгоритмы хеширования.
Однако исправить эту ситуацию довольно просто: достаточно использовать современные алгоритмы хеширования (такие, как bcrypt, Argon2) и принцип многократного хеширования и добавлять в пароли соль (salt).
- Аутентификация
Какие проблемы могут возникнуть с аутентификацией? Прежде всего, это слабая политика паролей, отсутствие защиты от брутфорса и небезопасное восстановление пароля.
Самым распространённым и простым способом является буквально временная блокировка после n-го числа неудачных попыток и защита с помощью капчи. Пользователей постоянно призывают использовать сложные и различающиеся от сайта к сайту пароли. Если говорить о более комплексных решениях, в последнее время наиболее предпочтительным методом защиты стала двухфакторная аутентификация.
- Настройки сервера
Решение проблем, связанных с настройками сервера в большинстве случаев связано с обновлением ПО и используемых сервисов. Нельзя забывать и про использование HTTPS, а также проверку настройки заголовков безопасности.
Также в целях повышения уровни защищённости разработки веб-приложений рекомендуется проводить регулярный аудит безопасности, использовать WAF (Web Application Firewall), осуществлять внедрение SAST- и DAST-инструментов и продолжать обучение разработчиков основам безопасности.
В рамках мониторинга и реагирования на инциденты необходимо:
- Осуществлять внедрение систем обнаружения вторжений
- Проводить систематический анализ логов
- Выстраивать план реагирования на инциденты
- Проводить резервное копирование данных
В рамках тестирования же важно периодически устраивать penetration testing, security code review, автоматизированное тестирование безопасности и, наконец, регулярные проверки конфигураций.
Безопасность веб-приложений требует комплексного подхода и постоянного внимания. Важно не только исправлять существующие уязвимости, но и предотвращать появление новых посредством обучения разработчиков и внедрения процессов безопасной разработки.

Автор: Григорий Базоян, ведущий пресейл-инженер 2 категории Cloud Networks.
