ホームページ >バックエンド開発 >PHPチュートリアル >PHP フォームに CSRF トークン保護を安全に実装するにはどうすればよいですか?

PHP フォームに CSRF トークン保護を安全に実装するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-17 20:00:20364ブラウズ

How to Securely Implement CSRF Token Protection in PHP Forms?

CSRF 防御テクニックの管理: PHP フォームを使用したウォークスルー

はじめに

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; ?>" />

弱点への対処

残念ながら、現在のトークン生成方法は欠陥のある技術を使用しています:

  • rand() は信頼できるランダム性のソースではありません。
  • uniqid() は限られた数のエントロピーを生成します。
  • md5() はエントロピーに寄与せず、むしろ並べ替えます。

堅牢なトークン ジェネレーターの実装

フォームを保護するには、次の 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
    }
}

追加の考慮事項

  • セキュリティを強化するために、各フォームに固有の CSRF トークンを作成することを検討してください。
  • 保護を強化するには、Twig テンプレート エンジンを利用してトークンの処理を簡素化し、それを
  • 独自の 1 回限りの CSRF トークンを作成するには、Paragon Initiative Enterprises の Anti-CSRF ライブラリなどの特殊なライブラリの使用を検討します。

以上がPHP フォームに CSRF トークン保護を安全に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。