0
$token = base64_encode( openssl_random_pseudo_bytes(32));

<input type="hidden" name="csrf_token" value="<?=$token?>">

$tokenon 出力をエスケープする必要がありますか?

4

2 に答える 2

2

base64 でエンコードされたデータをエスケープしても意味がありません。定義上、内部に制御文字 (または引用符など) は含まれません。

于 2013-03-03T22:01:11.043 に答える
0

実際、あなたはそうかもしれません。問題は、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?>">
于 2013-03-03T22:15:58.283 に答える