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 管理者のカスタマイズ。