Chuyển đến nội dung chính

レッスン 12: セキュリティのベスト プラクティス

Django の OWASP トップ 10。 XSS、CSRF、SQL インジェクションの防止。セキュリティミドルウェア、コンテンツセキュリティポリシー。レート制限、入力サニタイズ、安全なヘッダー。

💻 プログラミング — レッスン 12 レッスン 12: セキュリティのベスト プラクティス

Django: 基本から上級まで

パート 3: 認証とセキュリティ

xdev.asia

1. セキュリティ設定

# settings.py — Production security
SECURE_SSL_REDIRECT = True
SECURE_HSTS_SECONDS = 31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SECURE_CONTENT_TYPE_NOSNIFF = True

SESSION_COOKIE_SECURE = True
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_SAMESITE = 'Lax'
SESSION_COOKIE_AGE = 3600

CSRF_COOKIE_SECURE = True
CSRF_COOKIE_HTTPONLY = True

X_FRAME_OPTIONS = 'DENY'

2. SQL インジェクションの防止

# SAI — vulnerable
Product.objects.raw(f"SELECT * FROM products WHERE name = '{name}'")

# ĐÚNG — parameterized query
Product.objects.raw("SELECT * FROM products WHERE name = %s", [name])

# ĐÚNG — ORM (tự escape)
Product.objects.filter(name=name)

# Raw SQL an toàn
from django.db import connection
with connection.cursor() as cursor:
    cursor.execute("SELECT * FROM products WHERE price > %s", [min_price])

3. XSS の防止

# Django template auto-escapes by default
{{ user_input }}  {# Đã escape #}
{{ user_input|safe }}  {# NGUY HIỂM — tránh dùng #}

# Bleach để sanitize HTML
import bleach
clean_html = bleach.clean(
    user_html,
    tags=['p', 'b', 'i', 'a', 'ul', 'li'],
    attributes={'a': ['href', 'title']},
)

4. コンテンツセキュリティポリシー

pip install django-csp
# settings.py
MIDDLEWARE = [..., 'csp.middleware.CSPMiddleware']

CSP_DEFAULT_SRC = ("'self'",)
CSP_SCRIPT_SRC = ("'self'", 'cdn.example.com')
CSP_STYLE_SRC = ("'self'", "'unsafe-inline'")
CSP_IMG_SRC = ("'self'", 'data:', '*.amazonaws.com')

5. 入力の検証とサニタイズ

from django.core.validators import (
    RegexValidator, FileExtensionValidator,
)

class UserProfile(models.Model):
    phone = models.CharField(
        max_length=15,
        validators=[RegexValidator(r'^\+?[0-9]{9,15}$')],
    )
    avatar = models.FileField(
        validators=[FileExtensionValidator(allowed_extensions=['jpg', 'png', 'webp'])],
    )

# File upload size limit
FILE_UPLOAD_MAX_MEMORY_SIZE = 5 * 1024 * 1024  # 5MB
DATA_UPLOAD_MAX_MEMORY_SIZE = 10 * 1024 * 1024

6. セキュリティチェックリスト

# Django security check
python manage.py check --deploy
セクションステータス
デバッグ = 偽✅
環境からの SECRET_KEY✅
ALLOWED_HOSTS セット✅
HTTPSのみ✅
CSRF有効✅
SQLパラメータ化✅
ファイルのアップロードが検証されました✅
セキュリティヘッダー✅

次の記事: Django 管理者のカスタマイズ。