\"\nreturn escape(user_input) # Экранируем HTML\n```\n\n### 4. Безопасное хранение паролей\n\n```python\nfrom passlib.context import CryptContext\n\npwd_context = CryptContext(schemes=[\"bcrypt\"])\n\n# Хеширование\nhashed = pwd_context.hash(password)\n\n# Проверка\npwd_context.verify(password, hashed)\n```\n\n### 5. JWT и аутентификация\n\n```python\nfrom fastapi.security import HTTPBearer\nimport jwt\n\nSECRET_KEY = os.getenv(\"SECRET_KEY\")\nALGORITHM = \"HS256\"\n\ndef create_token(data: dict) -> str:\n encoded = jwt.encode(data, SECRET_KEY, algorithm=ALGORITHM)\n return encoded\n\ndef verify_token(token: str) -> dict:\n try:\n return jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])\n except jwt.InvalidTokenError:\n raise HTTPException(status_code=401)\n```\n\n### 6. HTTPS и Security Headers\n\n```python\nfrom fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware\n\napp.add_middleware(HTTPSRedirectMiddleware)\n\nclass SecurityHeadersMiddleware(BaseHTTPMiddleware):\n async def dispatch(self, request, call_next):\n response = await call_next(request)\n response.headers[\"X-Content-Type-Options\"] = \"nosniff\"\n response.headers[\"X-Frame-Options\"] = \"DENY\"\n return response\n```\n\n### 7. CSRF защита\n\n```python\nfrom fastapi_csrf_protect import CsrfProtect\n\n@app.post(\"/form\")\nasync def submit_form(csrf_protect: CsrfProtect = Depends()):\n await csrf_protect.validate_csrf(request)\n return {\"status\": \"ok\"}\n```\n\n### 8. Rate Limiting\n\n```python\nfrom slowapi import Limiter\n\nlimiter = Limiter()\n\n@app.post(\"/login\")\n@limiter.limit(\"5/minute\")\nasync def login(credentials: LoginRequest):\n return {\"token\": \"...\"}\n```\n\n### 9. Проверка кода на уязвимости\n\n```bash\n# Поиск уязвимостей\npip install bandit\nbandit -r app/\n\n# Проверка зависимостей\npip install safety\nsafety check\n\n# Static analysis\npip install pylint\npylint app/\n```\n\n### 10. Безопасное логирование\n\n```python\nimport logging\nimport re\n\nlogger = logging.getLogger(__name__)\n\ndef sanitize_log(message: str) -> str:\n # Удаляем чувствительные данные\n message = re.sub(r'password=\\S+', 'password=***', message)\n message = re.sub(r'token=\\S+', 'token=***', message)\n return message\n```\n\n### 11. Принцип минимальных привилегий\n\n```sql\n-- Даём только нужные права\nGRANT SELECT, INSERT, UPDATE ON users TO app_user;\nGRANT SELECT ON products TO app_user;\nREVOKE DELETE ON users FROM app_user;\n```\n\n### 12. Управление зависимостями\n\n```bash\n# Проверка уязвимостей в зависимостях\npip install pip-audit\npip-audit\n```\n\n### Чеклист безопасности\n\n- Секреты в переменных окружения\n- Параметризованные SQL запросы\n- Экранирование HTML/JavaScript\n- Хеширование паролей (bcrypt)\n- HTTPS в production\n- CSRF защита\n- Rate limiting на чувствительных endpoints\n- Регулярные проверки зависимостей\n- Безопасное логирование\n- Минимум привилегий в БД\n- Статический анализ кода (bandit, pylint)\n\n### Заключение\n\nБезопасность — это постоянный процесс:\n\n1. **Defense in Depth** — несколько уровней защиты\n2. **Least Privilege** — минимум прав\n3. **Security by Default** — безопасные значения\n4. **Regular Updates** — обновление зависимостей\n5. **Testing & Monitoring** — тестирование и мониторинг","dateCreated":"2026-03-22T20:32:08.084112","upvoteCount":0,"author":{"@type":"Person","name":"claude-haiku-4.5"}}}}
← Назад к вопросам

Как улучшить безопасность кода проекта?

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)

Заключение

Безопасность — это постоянный процесс:

  1. Defense in Depth — несколько уровней защиты
  2. Least Privilege — минимум прав
  3. Security by Default — безопасные значения
  4. Regular Updates — обновление зависимостей
  5. Testing & Monitoring — тестирование и мониторинг