ホームページ > バックエンド開発 > PHPチュートリアル > AJAX および標準フォームで使用すると、CSRF トークンが時々空になるのはなぜですか? PHP でこれを修正するにはどうすればよいですか?

AJAX および標準フォームで使用すると、CSRF トークンが時々空になるのはなぜですか? PHP でこれを修正するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-14 20:46:13
オリジナル
647 人が閲覧しました

Why are my CSRF tokens sometimes empty when used in AJAX and standard forms, and how can I fix this in PHP?

PHP での適切な CSRF トークン実装によるフォームのセキュリティ

質問:


< ;p>追加しようとすると、 CSRF トークンを 2 つの異なるフォーム (1 つは AJAX を使用し、もう 1 つは基本的な問い合わせフォームを使用) に送信すると、HTML 内のトークン値が散発的に空になることが観察されます。この問題はどのように解決できますか?

回答:

提供されているコードのように、問題はトークン生成方法に起因すると考えられます。予測とエントロピーの欠如に対して脆弱です。この方法は、1 回限りの使用およびフォームごとのトークン検証にも不十分です。

強力な CSRF トークンの生成:

トークン生成を安全なトークン生成に置き換えます。 PHP 7 または PHP 5.3 のメソッド:

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 (空($_SESSION['トークン'])) {

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 トークンの検証:

hash_equals() を使用してトークンを検証する安全に:


if (!empty($_POST['token'])) {

if (hash_equals($_SESSION['token'], $_POST['token'])) {
     // Proceed to process the form data
} else {
     // Log this as a warning and keep an eye on these attempts
}
ログイン後にコピー

}

Per -フォームトークン制限:

トークンを特定の形式にさらに制限するには、hash_hmac():


echo hash_hmac('sha256', '/my_form.php', $_SESSION['second_token']);
ログイン後にコピー

?>" />

Twig 統合によるハイブリッド アプローチ:

Twig テンプレートを使用している場合は、簡略化されたデュアル戦略を使用できます。実装:


$twigEnv->addFunction(

new \Twig_SimpleFunction(
    'form_token',
    function($lock_to = null) {
        if (empty($_SESSION['token'])) {
            $_SESSION['token'] = bin2hex(random_bytes(32));
        }
        if (empty($_SESSION['token2'])) {
            $_SESSION['token2'] = random_bytes(32);
        }
        if (empty($lock_to)) {
            return $_SESSION['token'];
        }
        return hash_hmac('sha256', $lock_to, $_SESSION['token2']);
    }
)
ログイン後にコピー

);

この関数を使用すると、安全な一般トークンを次のように使用できます。



フォームごとのトークンは次の方法で生成できます:



使い捨て CSRF トークン:

使い捨てトークンの要件については、次のような専用ライブラリの使用を検討してください。 Paragon Initiative Enterprises の反 CSRF ライブラリ。

以上がAJAX および標準フォームで使用すると、CSRF トークンが時々空になるのはなぜですか? PHP でこれを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート