HttpOnlyのない機密性の高いCookie

HttpOnlyフラグのない機密性の高いCookie

説明

HttpOnly のないCookieはJavaScriptから読み取れます。XSSが発生すると、挿入されたスクリプトに機密性の高いCookieの値を取得されるおそれがあります。HttpOnly自体がXSSを防ぐわけではありません。

想定される影響

  • Cookieの窃取: XSSのスクリプトにCookieの値を読み取られる可能性があります。
  • セッションの乗っ取り: 盗まれたセッションCookieで利用者になりすまされるおそれがあります。
  • 情報漏えい: Cookie内の機密情報が漏えいする可能性があります。

対処方法

  • 機密性の高いCookieには HttpOnly を設定し、JavaScriptからの読み取りを防ぎます。
  • 適切な入力検証と出力エンコードでXSSにも対処します。
  • Cookieの保護設定を見直し、不正なアクセスを制限します。

DjangoのCSRF CookieはセッションCookieとは用途が異なります。CSRF_COOKIE_HTTPONLY=False 自体は脆弱性ではありません。JavaScriptでCSRFトークンを取得する方法に合わせて設定してください。

例

変更前

python
# Djangoで保護フラグを設定しない例
SESSION_COOKIE_HTTPONLY = False

変更後

python
# Djangoで保護フラグを設定する例
SESSION_COOKIE_HTTPONLY = True

変更前

python
# Flaskで保護フラグを設定しない例
from flask import Flask

app = Flask(__name__)
app.config.update(
    SESSION_COOKIE_HTTPONLY=False,
)

変更後

python
# Flaskで保護フラグを設定する例
from flask import Flask

app = Flask(__name__)
app.config.update(
    SESSION_COOKIE_HTTPONLY=True,
)

変更前

python
# FastAPIで保護フラグを設定しない例
from fastapi import FastAPI, Response
import secrets

app = FastAPI()

@app.post("/set-cookie")
async def set_cookie(response: Response):
    session_id = secrets.token_urlsafe(32)  # サーバーが発行する予測困難なセッション値
    response.set_cookie(
        key="session",
        value=session_id,
        httponly=False,
        secure=True,
        samesite="lax",
    )
    return {"message": "Cookie set"}

変更後

python
# FastAPIで保護フラグを設定する例
from fastapi import FastAPI, Response
import secrets

app = FastAPI()

@app.post("/set-cookie")
async def set_cookie(response: Response):
    session_id = secrets.token_urlsafe(32)  # サーバーが発行する予測困難なセッション値
    response.set_cookie(
        key="session",
        value=session_id,
        httponly=True,
        secure=True,
        samesite="lax",
    )
    return {"message": "Cookie set"}

解説

  • 変更前: HttpOnly がないため、JavaScriptからCookieを読み取れます。
  • 変更後: HttpOnly でJavaScriptからの読み取りを防ぎます。

参考資料