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

PHP-如何在同一页面上以多种形式使用csrf令牌,php,forms,security,session,Php,Forms,Security,Session,我在同一页上有两张表格。我想以两种形式使用csrf令牌。当我尝试使用它时,它会在表单提交时重新生成csrf令牌 我怎样才能解决这个问题 <?php function csrf_token() { return bin2hex(random_bytes(35)); } function create_csrf_token() { $token = csrf_token(); $_SESSION['csrf_token'] = $token; $_SESSI

我在同一页上有两张表格。我想以两种形式使用csrf令牌。当我尝试使用它时,它会在表单提交时重新生成csrf令牌

我怎样才能解决这个问题

<?php

function 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>

...
...

刷新页面时,创建的\u csrf\u令牌函数再次启动,更改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>

...
...
create_csrf_令牌中添加isset将检查是否设置了csrf令牌,并返回现有的,而不是创建新的


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

您需要确定它的范围,即:
$\u会话['tokens']['formName']['CSRF\u token']
等,请查看“重新生成CSRF令牌”的代码或检查CSRF的代码在哪里?谢谢您的帮助!有没有关于重新生成令牌的提示?当然,将日期存储为类似于
$\u SESSION['time']=strottime(date(“Y-m-d h:i:s”,strotime(“now”))
的格式,然后在isset中/之前进行比较,比如
if(strotime(-5分钟”)>$\u SESSION['time'])
重新生成csrf再次感谢!我做过类似的事情:
if(!isset($_SESSION['csrf_token']))| strotime('-5分钟')>$_SESSION['csrf_token_time'])//生成一个新的令牌
如果此条件不成立,则返回相同的令牌。我看不出如图所示如何工作;会话从未开始。@FunkFortyNiner有效!我们在5分钟后重新生成令牌,或者如果没有CSRF令牌