为了账号安全,请及时绑定邮箱和手机立即绑定

PHP - 如何在同一页面上以多种形式使用csrf令牌

PHP - 如何在同一页面上以多种形式使用csrf令牌

PHP
犯罪嫌疑人X 2023-11-05 15:50:43
我在同一页上有 2 个表格。我想以两种形式使用 csrf 令牌。当我尝试使用它时,它会在提交表单时重新生成 csrf 令牌。我该如何解决这个问题?<?phpfunction csrf_token() {    return bin2hex(random_bytes(35));}function create_csrf_token() {    $token = csrf_token();    $_SESSION['csrf_token'] = $token;    $_SESSION['csrf_token_time'] = time();    return $token;}function csrf_token_tag() {    $token = create_csrf_token();    return '<input type="hidden" name="csrf_token" value="' . $token . '">';}$csrf_token = csrf_token_tag();?><form action="" method="post">    ...    <?= $csrf_token; ?></form><form action="" method="post">    ...    <?= $csrf_token; ?></form>
查看完整描述

1 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

当您刷新页面时,该函数created_csrf_token会再次触发,从而更改 CSRF 令牌。


你可以确定范围。例如


<?php


function csrf_token() {

    return bin2hex(random_bytes(35));

}


function create_csrf_token() {

    if (isset($_SESSION['csrf_token'])) {

        return $_SESSION['csrf_token'];

    }

    $token = csrf_token();

    $_SESSION['csrf_token'] = $token;

    $_SESSION['csrf_token_time'] = time();

    return $token;

}


function csrf_token_tag() {

    $token = create_csrf_token();

    return '<input type="hidden" name="csrf_token" value="' . $token . '">';

}


$csrf_token = csrf_token_tag();

?>


<form action="" method="post">

    ...

    <?= $csrf_token; ?>

</form>


<form action="" method="post">

    ...

    <?= $csrf_token; ?>

</form>

将 isset 添加到 中将create_csrf_token检查是否设置了 CSRF 令牌,并返回现有令牌,而不是创建新令牌。


不过,您可能想添加一些逻辑,以便在大约 5 分钟后创建一个新的 CSRF 令牌。


查看完整回答
反对 回复 2023-11-05
  • 1 回答
  • 0 关注
  • 56 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信