強力なトークンの生成にランダム バイトを使用する
CSRF トークン生成のコンテキストで rand() と uniqid() を使用するとセキュリティが確保されます予測可能性と限られたエントロピーによるリスク。代わりに、
session_start(); if (empty($_SESSION['token'])) { $_SESSION['token'] = bin2hex(random_bytes(32)); } $token = $_SESSION['token'];
CSRF トークンを安全に検証する
直接等価性チェック (== または ===) の使用を避けます。代わりに、PHP 5.6 の場合は hash_equals() を、以前のバージョンの場合は paragonie/hash-compat を使用してください:
if (!empty($_POST['token'])) { if (hash_equals($_SESSION['token'], $_POST['token'])) { // Proceed to form data processing } else { // Log and monitor these attempts } }
フォームごとのトークンによるセキュリティの強化
トークンを制限するには特定のフォームに使用するにはhash_hmac():
echo hash_hmac('sha256', '/my_form.php', $_SESSION['second_token']);
$calc = hash_hmac('sha256', '/my_form.php', $_SESSION['second_token']); if (hash_equals($calc, $_POST['token'])) { // Continue... }
簡素化のためのハイブリッド アプローチ
Twig テンプレートを使用すると、カスタム Twig 関数を使用してトークン生成を簡素化できます。
$twigEnv->addFunction( new \Twig_SimpleFunction( 'form_token', function($lock_to = null) { // ... } ) );
<input type="hidden" name="token" value="{{ form_token() }}" />
または、ロックされたトークン:
<input type="hidden" name="token" value="{{ form_token('/my_form.php') }}" />
使い捨て CSRF トークン
必要に応じて、使い捨て CSRF トークンを管理するための特殊なライブラリの使用を検討してください。 Paragon Initiative Enterprises による CSRF ライブラリ。
以上がPHP で CSRF トークンを安全に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。