これは CSRF トークンの生成に関する質問です。
通常、ユーザーのセッションに関連付けられた一意のデータに基づいてトークンを生成し、秘密鍵でハッシュおよびソルト化したいと考えています。
私の質問は、使用する一意のユーザー データがない場合のトークンの生成に関するものです。セッションは利用できません。Cookie はオプションではありません。IP アドレスとその性質のものは信頼できません。
ハッシュする文字列をリクエストの一部として含めることができない理由はありますか? トークンを生成して埋め込む疑似コードの例:
var $stringToHash = random()
var $csrfToken = hash($stringToHash + $mySecretKey)
<a href="http://foo.com?csrfToken={$csrfToken}&key={$stringToHash}">click me</a>
CSRF トークンのサーバー側検証の例
var $stringToHash = request.get('key')
var $isValidToken = hash($stringToHash + $mySecrtKey) == request.get('csrfToken')
ハッシュで使用される文字列は、リクエストごとに異なります。それが各リクエストに含まれている限り、CSRF トークンの検証は続行できます。リクエストごとに新しく、ページにのみ埋め込まれているため、トークンへの外部アクセスは利用できません。トークンのセキュリティは、私だけが知っている $mySecretKey に委ねられます。
これは素朴なアプローチですか?これが機能しない理由がありませんか?
ありがとう