Ответ
Защита веб-приложений требует комплексного подхода ("defense in depth"). Ключевые практики для предотвращения распространенных уязвимостей:
-
Защита от SQL-инъекций Никогда не используйте конкатенацию строк для построения SQL-запросов. Используйте ORM (SQLAlchemy, Django ORM) или параметризованные запросы, где драйвер базы данных безопасно экранирует данные.
# ПРАВИЛЬНО: данные передаются отдельно от запроса cursor.execute("SELECT * FROM users WHERE username = %s", (user_name,)) # НЕПРАВИЛЬНО: уязвимость к инъекции # cursor.execute(f"SELECT * FROM users WHERE username = '{user_name}'") -
Защита от Cross-Site Scripting (XSS) Всегда экранируйте пользовательский ввод перед отображением в HTML. Современные шаблонизаторы (Jinja2, Django Templates) делают это автоматически по умолчанию. Не отключайте автоэкранирование без крайней необходимости.
-
Защита от Cross-Site Request Forgery (CSRF) Используйте CSRF-токены для всех запросов, изменяющих состояние (POST, PUT, DELETE). Ведущие фреймворки (Django, Flask с WTForms) имеют встроенную поддержку для генерации и проверки этих токенов.
-
Безопасное хранение паролей Храните не сами пароли, а их хеши, созданные с помощью адаптивных алгоритмов с "солью", таких как Argon2 или bcrypt. Используйте для этого готовые библиотеки, например
passlib.from passlib.context import CryptContext pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") # Хеширование пароля hashed_password = pwd_context.hash("mysecretpassword") # Проверка пароля is_correct = pwd_context.verify("mysecretpassword", hashed_password) -
Регулярное обновление зависимостей Уязвимости часто находят в сторонних библиотеках. Используйте инструменты вроде
pip-auditили сервисы (GitHub Dependabot) для сканирования проекта на наличие уязвимых пакетов и своевременно их обновляйте. -
Общие принципы
- HTTPS: Всегда используйте TLS/SSL для шифрования трафика.
- Минимальные привилегии: Приложение должно работать с минимально необходимыми правами доступа к файловой системе и базе данных.
- Отключение режима отладки (Debug Mode) в продакшене, чтобы не раскрывать чувствительную информацию.