説明
Secure のないCookieは暗号化されていないHTTPでも送信されるため、通信の傍受や中間者攻撃によって機密性の高い値が漏えいするおそれがあります。
想定される影響
- 情報漏えい: 傍受されたCookieから機密情報を取得されたり、セッションを盗まれたりする可能性があります。
- セッションの乗っ取り: セッションCookieを取得した攻撃者に、利用者になりすまされるおそれがあります。
- データ改ざん: Cookieの値の改ざんが、アプリケーションの完全性に影響する可能性があります。
対処方法
Secureを設定し、ブラウザーがHTTPSでのみCookieを送信するようにします。
例
DjangoのCookie設定
変更前
python
# Djangoで保護フラグを設定しない例
SESSION_COOKIE_SECURE = False
CSRF_COOKIE_SECURE = False
変更後
python
# Djangoで保護フラグを設定する例
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
FlaskのCookie設定
変更前
python
# Flaskで保護フラグを設定しない例
from flask import Flask
app = Flask(__name__)
app.config.update(
SESSION_COOKIE_SECURE=False,
)
変更後
python
# Flaskで保護フラグを設定する例
from flask import Flask
app = Flask(__name__)
app.config.update(
SESSION_COOKIE_SECURE=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,
secure=False,
httponly=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,
secure=True,
httponly=True,
samesite="lax",
)
return {"message": "Cookie set"}
解説
- 変更前:
Secureがないため、HTTPでCookieが送信される可能性があります。 - 変更後:
Secureは送信をHTTPSに限定します。HttpOnlyは別の保護で、JavaScriptからの読み取りを防ぎます。