Planet Python 日本語 フォロー Bob Belderbos: ログインなしの購読解除リンク:Djangoの署名 Djangoのsigningモジュールは、ユーザーのログインやセッションなしで安全な購読解除リンクを可能にします。URLに直接ユーザーIDを使用する安全でないアプローチは、大量購読解除の脆弱性があります。データベースにランダムなトークンを保存するのは一般的な修正ですが、より複雑です。Djangoのdjango.core.signingモジュールは、SECRET_KEYで値(ユーザーの主キーなど)に署名することにより、データベースストレージを必要とせずに改ざん防止トークンを提供します。「ソルト」は、異なる機能間のトークン衝突を防ぐために重要であり、ある目的(例:お知らせ)のトークンを別の目的(例:フォーラム通知)に使用できないようにします。署名されているとはいえ、トークンは秘密ではなく、その中のデータは読み取り可能ですが、署名を無効にせずに変更することはできません。したがって、隠すべき機密情報を署名しないでください。重要なのは、メールスキャナーやプリフェッチャーが意図せずユーザーを購読解除してしまうのを防ぐために、購読解除アクションはGETリクエストではなくPOSTリクエストで行うべきです。GETでの確認ページ、それに続いてアクションを完了するためのPOSTが推奨されるフローです。購読解除トークンは、古いリンクを2回クリックしても同じ安全な結果が得られるため、有効期限が不要な場合が多いです。しかし、マジックログインリンクのような機密性の高いアクションでは、signing.loadsのmax_age引数がデータベースストレージなしで有効期限を提供します。メール検証のような一度限りのトークンシナリオでは、署名だけでは使用状況を追跡できないため、追加の状態管理(使用済みトークンのデータベースレコード)が必要です。 Bob Belderbos: Unsubscribe links without a login: Django signing belderbos.dev Planet Python 日本語 RSS thenote.app
django.core.signingモジュールは、SECRET_KEYで値(ユーザーの主キーなど)に署名することにより、データベースストレージを必要とせずに改ざん防止トークンを提供します。「ソルト」は、異なる機能間のトークン衝突を防ぐために重要であり、ある目的(例:お知らせ)のトークンを別の目的(例:フォーラム通知)に使用できないようにします。署名されているとはいえ、トークンは秘密ではなく、その中のデータは読み取り可能ですが、署名を無効にせずに変更することはできません。したがって、隠すべき機密情報を署名しないでください。重要なのは、メールスキャナーやプリフェッチャーが意図せずユーザーを購読解除してしまうのを防ぐために、購読解除アクションはGETリクエストではなくPOSTリクエストで行うべきです。GETでの確認ページ、それに続いてアクションを完了するためのPOSTが推奨されるフローです。購読解除トークンは、古いリンクを2回クリックしても同じ安全な結果が得られるため、有効期限が不要な場合が多いです。しかし、マジックログインリンクのような機密性の高いアクションでは、signing.loadsのmax_age引数がデータベースストレージなしで有効期限を提供します。メール検証のような一度限りのトークンシナリオでは、署名だけでは使用状況を追跡できないため、追加の状態管理(使用済みトークンのデータベースレコード)が必要です。