Django公式は、CSRFのReferer検証との競合を避けるため、外部リンク個別にrel="noreferrer"を使う方法を案内しています。
PUT、PATCH、DELETEなども状態を変更します。
安全なメソッド以外はすべて検証対象にします。
次の実装は危険です。
if request.POST.get("csrf"):
validate_csrf(request.POST["csrf"])
トークンを削除すれば検証自体が実行されません。
正しくは、トークンがない場合も拒否します。
環境変数や固定文字列をそのままフォームへ入れる方式は、1人から漏れると全利用者へ悪用されます。
# 危険
CSRF_TOKEN = "fixed-secret-token"
トークンをセッションまたは認証状態へ関連付けます。
csrf=12345
csrf=user_1001
csrf=20260729
予測可能な値は防御になりません。
暗号学的に安全な乱数を使います。
https://example.com/update?csrf=SECRET