如何解决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>
解决方法
刷新页面时,函数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>
在create_csrf_token
中添加一个isset将检查CSRF令牌是否已设置,并返回现有令牌,而不是创建新令牌。
您可能想添加一些逻辑,以便在5分钟后创建一个新的CSRF令牌。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。