説明
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トークンを取得する方法に合わせて設定してください。
例
DjangoのCookie設定
変更前
python
# Djangoで保護フラグを設定しない例
SESSION_COOKIE_HTTPONLY = False
変更後
python
# Djangoで保護フラグを設定する例
SESSION_COOKIE_HTTPONLY = True
FlaskのCookie設定
変更前
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,
)
FastAPIのCookie設定
変更前
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からの読み取りを防ぎます。
参考資料
- OWASP: セッション管理チートシート
- CWE: CWE-1004: HttpOnlyのない機密性の高いCookie