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

我在同一页上有 2 个表格。我想以两种形式使用 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>


犯罪嫌疑人X
浏览 95回答 1
1回答

呼啦一阵风

当您刷新页面时,该函数created_csrf_token会再次触发,从而更改 CSRF 令牌。你可以确定范围。例如<?phpfunction 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 令牌。
打开App,查看更多内容
随时随地看视频慕课网APP