Ответ
Для повышения безопасности 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 для рутинных операций.