Upgrade to Pro — share decks privately, control downloads, hide ads and more …

企業がDjangoを使う際に、特にセキュリティで気をつけること

 企業がDjangoを使う際に、特にセキュリティで気をつけること

2025/11/19 Python・Djangoのセキュリティセミナー ~市場動向から実践的な話まで~
https://kusanagi.biz/event-seminar/python_django_20251119/
https://enterprise-wordpress.doorkeeper.jp/events/191900

Avatar for Kashun Yoshida

Kashun Yoshida

November 25, 2025
Tweet

More Decks by Kashun Yoshida

Other Decks in Programming

Transcript

  1. Who am I? / 自己紹介 吉田花春 (Yoshida Kashun) 𝕏 @kashew_nuts

    BeProud Inc. Django歴: 8年以上 PyCon JP・DjangoCongress JP 登壇 / 書籍・雑誌執筆経験あり 「Djangoの安全設計」と「実運用での落とし穴」を 開発現場の視点から共有します。 3 / 42
  2. バッテリー同梱の哲学: フルスタックで安全機構を標準装備 "安全にしやすい" フレームワーク設計 ミドルウェア(セキュリティ / クリックジャッキング / CSRF /

    Session) 認証(User / Permission / 認証システム / パスワード管理) ORM(Models / QuerySet / Migrations) View層(URLconf / Views / ファイルアップロード) テンプレートエンジン(autoescape / filters) 管理インターフェース(admin) フォーム キャッシュフレームワーク 国際化と地域化 6 / 42
  3. OWASP Top 10 Web アプリケーションによくある脆弱性と対処方法について解説 A01: アクセス制御の不備 A03: インジェクション A05:

    セキュリティの設定ミス A07: 識別と認証の失敗 A08: ソフトウェアとデータの整合性の不具合 → Djangoは多くをカバー可能 [1] https://owasp.org/Top10/ja/ 14 / 42
  4. settings.py での防御線 SECURE_SSL_REDIRECT = True CSRF_COOKIE_SECURE = True SESSION_COOKIE_HTTPONLY =

    True SECURE_HSTS_SECONDS = 31536000 # 1年 → HTTPS, Cookie保護, HSTS 17 / 42
  5. ALLOWED_HOSTSとProxy # Hostヘッダインジェクション回避(受け付けるHostを絞る) ALLOWED_HOSTS = ['app.example.com'] # CloudFront や ALB配下で動かすときに

    USE_X_FORWARDED_HOST = True SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') → CloudFront/ALB配下での正しい設定 20 / 42
  6. CSP(Content Security Policy) 設定 CSP_DEFAULT_SRC = ["'self'", "*.example.com"] CSP_SCRIPT_SRC =

    ["'self'", "js.cdn.com/example/"] django-csp を活用し report-only 運用から始める 次第により厳格なCSPである nonce- もしくは hash- ベース にしていく Django 6.0(2025年12月予定)で標準対応予定 [1] https://pypi.org/project/django-csp/ 22 / 42
  7. ファイルアップロード Request Boundary Form / Serializer でサイズ・MIME・拡張子を検証 FileExtensionValidator など Django標準のバリデータ活用

    Application Logic Pillow で画像を再エンコード(Exif除去・形式正規化) アップロード処理を ビジネスロジックとして集約して「直接保存させない」 Data & External FileField + Storage backend(django-storages / S3) S3はprivate、配布はPresigned URL or CloudFrontで [1] https://pypi.org/project/pillow/ [2] https://pypi.org/project/django-storages/ 25 / 42
  8. メールヘッダインジェクション Djangoは防御済み ユーザー入力を直接 Subject / From / To に入れず、バリデーションを挟む EmailField

    で形式チェック 改行(\r\n)を禁止するバリデータを挟む From は固定アドレス、ユーザーのメールは reply_to で扱うのも検討 27 / 42
  9. セッション管理 Cookie属性 Secure=True(HTTPS必須) HttpOnly=True(XSSから保護) SameSite=Lax(デフォルト安全) 権限昇格時はセッションIDをローテート。セッション固定攻撃(Session Fixation) を避ける Djangoの login()

    が自動で実施 Django Adminから指定するなど特殊ケースでは session.flush() キャッシュ禁止ヘッダ @never_cache デコレータを活用して no-store を付与 30 / 42
  10. 構造化ログ django-structlog or python-json-logger リクエストID / ユーザーID / 成功・失敗を記録 [1]

    https://pypi.org/project/django-structlog/ [2] https://pypi.org/project/python-json-logger/ 32 / 42
  11. 静的解析とCI Ruff ( flake8-bugbear, bandit), detect-secrets pre-commit でチェック自動化 $ pre-commit

    run --all-files [1] https://pypi.org/project/ruff/ [2] https://pypi.org/project/detect-secrets/ [3] https://pre-commit.com/ 33 / 42
  12. 依存関係と脆弱性管理 pip-audit / safety / Dependabot CIで定期チェックを自動化 [1] https://pypi.org/project/pip-audit/ [2]

    https://pypi.org/project/safety/ [3] https://docs.github.com/ja/code-security/dependabot 34 / 42