我知道CSRF实际上是如何工作的,它通常将随机文本存储在会话中,并在HTML表单的隐藏令牌CSRF字段中具有相同的内容。当用户提交表单时,HTML表单令牌分别匹配会话CSRF和validate。
问题是,如果我刷新页面,将会生成新的CSRF令牌,并且在下一次刷新之前只有效一次。在这种情况下,如果我在新选项卡中多次打开相同的表单并提交后续表单,框架或任何人将如何在会话中存储令牌并验证它。它是存储最新的令牌,还是存储以数组形式生成的所有新令牌,在验证令牌后,它将从会话中删除该令牌。
当HTML表单在多个选项卡中打开并逐个提交时,我无法获得如何处理同一用户的多个令牌。
我正在将会话转储到控制器中,但根据我的假设,无法看到那里的所有令牌。
有谁能帮我理解它是如何处理。
发布于 2017-12-29 16:52:27
我使用https://github.com/Vundo/CSRF
它是如此简单,它可以得到
session_start();
<form method="post" accept-charset="UTF-8">
<input type="submit" value="<?php echo SUBMIT ?>">
<input type="hidden" name="_token" value="<?php echo CSRF::generate() ?>">
</form>提交后的接收页面:
$session_start();
if(isset($_POST['xxxxxxx'])) {
if(!CSRF::check($_POST['_token'])){
exit('Wrong Token!');
}发布于 2017-12-29 18:10:50
在CodeIgniter中,您每次打开一个表单,或者在您的例子中,打开一个新的选项卡(您指的是浏览器选项卡,对吗?)你会得到一个代币。此令牌被存储,并使用form_open输出到隐藏输入。在提交时,它会检查以确保存储的令牌和表单令牌相同。这是一个非常简单的过程,就像halojoy概述的那样。
您在评论中表示,尽管在不同的选项卡中打开了多个表单,但您仍然可以提交表单,而不会出现CSRF错误。这很可能是由于配置设置$config['csrf_regenerate'] = FALSE;造成的
令牌可以在每次提交时重新生成(默认),或者在CSRF cookie的整个生命周期中保持不变。令牌的默认重新生成提供了更严格的安全性,但可能会导致可用性问题,因为其他令牌变得无效(后退/前进导航、多个选项卡/窗口、异步操作等)。您可以通过编辑以下配置参数来更改此行为
因此,基本上,如果您启用了重新生成,那么每次您打开一个带有表单的新选项卡时,cookie都会重新生成。因此,最后打开的表单将是最后设置的表单,并且具有唯一有效的CSRF令牌。
示例:
提交时选项卡%1中的表单将失败,而选项卡%2中的表单将成功。
https://stackoverflow.com/questions/48019314
复制相似问题