← Назад к вопросам
Как улучшить безопасность кода проекта?
1.7 Middle🔥 111 комментариев
#REST API и HTTP#Безопасность
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Безопасность Python проекта
Безопасность — это не одна функция, а целая культура разработки. Давайте разберёмся с конкретными шагами для улучшения безопасности вашего кода.
1. Управление секретами и окружением
Проблема:
# Никогда так не делай
DATABASE_URL = "postgresql://admin:password123@db.example.com/prod"
SECRET_KEY = "my-super-secret-key-1234567890"
Правильный подход:
import os
from dotenv import load_dotenv
load_dotenv()
DATABASE_URL = os.getenv("DATABASE_URL")
SECRET_KEY = os.getenv("SECRET_KEY")
if not SECRET_KEY:
raise ValueError("SECRET_KEY не установлен")
2. Валидация входных данных
Проблема: SQL Injection
# Уязвимо
query = f"SELECT * FROM users WHERE id = {user_id}"
db.execute(query)
Правильно:
from sqlalchemy import select
stmt = select(User).where(User.id == user_id)
user = db.execute(stmt).scalar_one_or_none()
3. Защита от XSS
from html import escape
user_input = "<script>alert('hacked')</script>"
return escape(user_input) # Экранируем HTML
4. Безопасное хранение паролей
from passlib.context import CryptContext
pwd_context = CryptContext(schemes=["bcrypt"])
# Хеширование
hashed = pwd_context.hash(password)
# Проверка
pwd_context.verify(password, hashed)
5. JWT и аутентификация
from fastapi.security import HTTPBearer
import jwt
SECRET_KEY = os.getenv("SECRET_KEY")
ALGORITHM = "HS256"
def create_token(data: dict) -> str:
encoded = jwt.encode(data, SECRET_KEY, algorithm=ALGORITHM)
return encoded
def verify_token(token: str) -> dict:
try:
return jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
except jwt.InvalidTokenError:
raise HTTPException(status_code=401)
6. HTTPS и Security Headers
from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware
app.add_middleware(HTTPSRedirectMiddleware)
class SecurityHeadersMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request, call_next):
response = await call_next(request)
response.headers["X-Content-Type-Options"] = "nosniff"
response.headers["X-Frame-Options"] = "DENY"
return response
7. CSRF защита
from fastapi_csrf_protect import CsrfProtect
@app.post("/form")
async def submit_form(csrf_protect: CsrfProtect = Depends()):
await csrf_protect.validate_csrf(request)
return {"status": "ok"}
8. Rate Limiting
from slowapi import Limiter
limiter = Limiter()
@app.post("/login")
@limiter.limit("5/minute")
async def login(credentials: LoginRequest):
return {"token": "..."}
9. Проверка кода на уязвимости
# Поиск уязвимостей
pip install bandit
bandit -r app/
# Проверка зависимостей
pip install safety
safety check
# Static analysis
pip install pylint
pylint app/
10. Безопасное логирование
import logging
import re
logger = logging.getLogger(__name__)
def sanitize_log(message: str) -> str:
# Удаляем чувствительные данные
message = re.sub(r'password=\S+', 'password=***', message)
message = re.sub(r'token=\S+', 'token=***', message)
return message
11. Принцип минимальных привилегий
-- Даём только нужные права
GRANT SELECT, INSERT, UPDATE ON users TO app_user;
GRANT SELECT ON products TO app_user;
REVOKE DELETE ON users FROM app_user;
12. Управление зависимостями
# Проверка уязвимостей в зависимостях
pip install pip-audit
pip-audit
Чеклист безопасности
- Секреты в переменных окружения
- Параметризованные SQL запросы
- Экранирование HTML/JavaScript
- Хеширование паролей (bcrypt)
- HTTPS в production
- CSRF защита
- Rate limiting на чувствительных endpoints
- Регулярные проверки зависимостей
- Безопасное логирование
- Минимум привилегий в БД
- Статический анализ кода (bandit, pylint)
Заключение
Безопасность — это постоянный процесс:
- Defense in Depth — несколько уровней защиты
- Least Privilege — минимум прав
- Security by Default — безопасные значения
- Regular Updates — обновление зависимостей
- Testing & Monitoring — тестирование и мониторинг