Как защитить API от CSRF и SQL-инъекций?python-50

1. Защита от CSRF

Основные механизмы защиты:

1.1. CSRF-токены

# Django пример (встроенная защита)
# В settings.py
MIDDLEWARE = [
    ...
    'django.middleware.csrf.CsrfViewMiddleware',
]

# В шаблоне
<form method="post">
    {% csrf_token %}
    ...
</form>

# Для API в Django REST Framework
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response

@api_view(['POST'])
@permission_classes([IsAuthenticated])
def secure_view(request):
    # DRF автоматически проверяет CSRF для аутентифицированных сессий
    return Response({"message": "Защищённый эндпоинт"})

1.2. Заголовки CORS

# Пример настройки CORS в Django
INSTALLED_APPS = [
    ...
    'corsheaders',
]

MIDDLEWARE = [
    ...
    'corsheaders.middleware.CorsMiddleware',
]

CORS_ALLOWED_ORIGINS = [
    "https://trusted-domain.com",
]

1.3. SameSite cookies

# В settings.py Django
SESSION_COOKIE_SAMESITE = 'Strict'  # или 'Lax'
CSRF_COOKIE_SAMESITE = 'Strict'

2. Защита от SQL-инъекций

2.1. Использование ORM

# НЕПРАВИЛЬНО (уязвимый код)
from django.db import connection

def get_user_unsafe(username):
    with connection.cursor() as cursor:
        cursor.execute(f"SELECT * FROM users WHERE username = '{username}'")
        return cursor.fetchall()

# ПРАВИЛЬНО (использование ORM)
from django.contrib.auth.models import User

def get_user_safe(username):
    return User.objects.filter(username=username)

2.2. Параметризованные запросы

# Безопасный пример с параметризацией
from django.db import connection

def get_user_safe(username):
    with connection.cursor() as cursor:
        cursor.execute("SELECT * FROM users WHERE username = %s", [username])
        return cursor.fetchall()

2.3. Валидация входных данных

from django.core.exceptions import ValidationError
from django.utils.html import escape

def clean_input(input_str):
    if not input_str.isalnum():  # Проверка на алфавитно-цифровые символы
        raise ValidationError("Недопустимые символы в строке")
    return escape(input_str)  # Экранирование специальных символов

2.4. Ограничение прав доступа БД

# В settings.py Django
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'USER': 'app_user',  # Специальный пользователь с минимальными правами
        'PASSWORD': 'securepassword',
        'NAME': 'app_db',
        'OPTIONS': {
            'options': '-c statement_timeout=1000'  # Таймаут запросов
        }
    }
}

3. Дополнительные меры защиты API

3.1. Заголовки безопасности

# Django Security Middleware
SECURE_BROWSER_XSS_FILTER = True
SECURE_CONTENT_TYPE_NOSNIFF = True
X_FRAME_OPTIONS = 'DENY'

3.2. Ограничение частоты запросов

# DRF Throttling
REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/day',
        'user': '1000/day'
    }
}

3.3. Валидация данных через сериализаторы

from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['username', 'email']
        extra_kwargs = {
            'username': {
                'min_length': 4,
                'max_length': 32,
                'validators': [RegexValidator(r'^[a-zA-Z0-9_]+$')]
            }
        }

Резюмируем

Для защиты от CSRF:

  1. Используйте CSRF-токены для веб-форм
  2. Настройте правильную политику CORS
  3. Используйте SameSite атрибуты для cookies
  4. Для API используйте токенную аутентификацию вместо сессий

Для защиты от SQL-инъекций:

  1. Всегда используйте ORM или параметризованные запросы
  2. Валидируйте и экранируйте все пользовательские данные
  3. Ограничивайте права доступа к БД
  4. Используйте таймауты для запросов

Общие рекомендации:

  1. Регулярно обновляйте зависимости
  2. Используйте статические анализаторы кода (bandit, safety)
  3. Настройте правильные HTTP-заголовки безопасности
  4. Реализуйте систему мониторинга и логирования

Правильная комбинация этих мер значительно повысит безопасность вашего API.