Какие основные практики для повышения безопасности Python-приложения?

«Какие основные практики для повышения безопасности Python-приложения?» — вопрос из категории Безопасность, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для повышения безопасности Python-приложения следует применять комплексный подход, охватывающий код, зависимости и конфигурацию.

1. Валидация и очистка пользовательского ввода Никогда не доверяйте данным, поступающим от пользователя. Используйте Pydantic для валидации структуры данных или bleach для очистки HTML.

from pydantic import BaseModel, constr

class UserRegistration(BaseModel):
    # Ограничиваем имя пользователя, чтобы избежать инъекций
    username: constr(strip_whitespace=True, min_length=3, max_length=50)
    email: str

2. Использование ORM для защиты от SQL-инъекций ORM (например, SQLAlchemy, Django ORM) автоматически экранирует параметры, что делает SQL-инъекции практически невозможными.

# Плохо: уязвимо для SQL-инъекции
cursor.execute(f"SELECT * FROM users WHERE username = '{user_input}'")

# Хорошо: ORM безопасно параметризует запрос
user = session.query(User).filter(User.username == user_input).first()

3. Безопасное хранение паролей Всегда хешируйте пароли с использованием сильных, адаптированных алгоритмов, таких как bcrypt или argon2. Никогда не храните пароли в открытом виде.

import bcrypt

password = b"supersecretpassword"
# Генерация "соли" и хеширование
hashed = bcrypt.hashpw(password, bcrypt.gensalt())

# Проверка пароля
if bcrypt.checkpw(password, hashed):
    print("Пароль верный")

4. Аудит и обновление зависимостей Регулярно проверяйте зависимости на наличие известных уязвимостей с помощью инструментов safety или pip-audit и своевременно их обновляйте.

# Установка
pip install safety

# Проверка зависимостей в текущем окружении
safety check

5. Статический анализ кода Используйте статический анализатор bandit для автоматического поиска распространенных проблем безопасности в коде.

# Установка
pip install bandit

# Запуск анализа для проекта
bandit -r ./your_project_directory

6. Принцип наименьших привилегий Приложение и его компоненты (например, подключение к БД) должны работать с минимально необходимыми правами. Не используйте root или superuser для рутинных операций.