ホームページ >バックエンド開発 >PHPチュートリアル >PHP フォームに CSRF トークン保護を安全に実装するにはどうすればよいですか?
はじめに
Web サイトに適切なセキュリティ強化を追加するには、次のような対処が必要です。クロスサイト リクエスト フォージェリ (CSRF) などの潜在的な脆弱性。この記事では、PHP を使用して CSRF トークンを効果的に追加する方法について詳しく説明します。
問題を理解する
Web サイトに CSRF トークン保護を実装しましたが、トークンの値に一貫性がありませんHTML フォームに存在します。具体的には、「お問い合わせ」フォームと AJAX フォームでこの問題が発生しています。
コードの確認
トークン:
PHP:
if (!isset($_SESSION)) { session_start(); $_SESSION['formStarted'] = true; } if (!isset($_SESSION['token'])) { $token = md5(uniqid(rand(), TRUE)); $_SESSION['token'] = $token; }
HTML:
<input type="hidden" name="token" value="<?php echo $token; ?>" />
弱点への対処
残念ながら、現在のトークン生成方法は欠陥のある技術を使用しています:
堅牢なトークン ジェネレーターの実装
フォームを保護するには、次の PHP コードを利用してください:
PHP 7:
session_start(); if (empty($_SESSION['token'])) { $_SESSION['token'] = bin2hex(random_bytes(32)); } $token = $_SESSION['token'];
PHP 5.3 (または ext-mcrypt を使用):
session_start(); if (empty($_SESSION['token'])) { if (function_exists('mcrypt_create_iv')) { $_SESSION['token'] = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)); } else { $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32)); } } $token = $_SESSION['token'];
トークンの検証
次に、CSRF トークンを適切に検証して、次のような試みを防ぎます。悪用:
if (!empty($_POST['token'])) { if (hash_equals($_SESSION['token'], $_POST['token'])) { // Proceed to process the form data } else { // Log this as a warning and monitor such attempts } }
追加の考慮事項
以上がPHP フォームに CSRF トークン保護を安全に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。