$token = base64_encode( openssl_random_pseudo_bytes(32));
<input type="hidden" name="csrf_token" value="<?=$token?>">
$token
on 出力をエスケープする必要がありますか?
$token = base64_encode( openssl_random_pseudo_bytes(32));
<input type="hidden" name="csrf_token" value="<?=$token?>">
$token
on 出力をエスケープする必要がありますか?
base64 でエンコードされたデータをエスケープしても意味がありません。定義上、内部に制御文字 (または引用符など) は含まれません。
実際、あなたはそうかもしれません。問題は、base64 エンコーディング文字の 1 つであるインデックス 62 の文字が実際には PHP によってプラス文字 (+) としてエンコードされ、プラス文字を送信するときにブラウザーによってスペースとして URL デコードされる可能性があるという事実にあります。 (というか、ブラウザとサーバーの間の何か - プロキシ、ロード バランサー、フィルターなど) によって。
したがって、一部のデータは、別の文字列としてデコードされる形式でエンコードされるリスクがあります (スペースが base64 スキームを壊すため、実際にはまったくデコードされません)。
最新の Firefox と Chrome は両方とも、その + を %2B に正しくエンコードします (テストしたばかりです)。標準では、+ は常にエンコードする必要があり、 base64 ではさらにエスケープする必要はないと規定されているようですが、場合によっては問題が発生します ( URL と plusを参照)。兆候)。
トークンが 99.97% の確率で機能する危険を冒すのではなく (マーフィーのルールでは 0.03% が最も必要な日です)、簡単な回避策は、トークンを16 進数のバイト表現に変換することです。
$token = bin2hex(openssl_random_pseudo_bytes(32));
<input type="hidden" name="csrf_token" value="<?=$token?>">