我知道CSRF实际上是如何工作的,它通常将随机文本存储在会话中,并且在隐藏令牌CSRF字段中的HTML表单上也是如此。当用户提交表单时,HTML表单标记与会话CSRF匹配并分别进行验证。
怀疑是如果我刷新页面,将生成新的CSRF令牌,并且只有一次有效,直到下一次刷新。在这种情况下,如果我在新选项卡中多次打开相同的表单并提交后续表单,框架或任何人如何在会话中存储令牌并验证它。它是存储最新的令牌还是将存储以数组形式生成的所有新令牌,在验证令牌后它将从会话中删除令牌。
当HTML表单在多个标签页中打开并一个接一个地提交时,我无法获得同一用户的多个令牌的处理方式。
我在控制器中转储会话但根据我的假设无法看到那里的所有令牌。
任何人都可以帮我理解它的处理方式。
答案 0 :(得分:0)
我使用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!');
}
答案 1 :(得分:0)
在CodeIgniter每次打开表单时,或者在您的情况下,新选项卡(您的意思是浏览器选项卡对吗?)都会获得一个令牌。存储此令牌,并使用form_open
输出到隐藏输入。在提交时,检查以确保存储的令牌和表单令牌是相同的。这是一个非常简单的过程,就像halojoy概述的那样。
在评论中,您声明尽管在不同的标签页中打开了多个表单,但您仍然可以在没有CSRF错误的情况下提交表单。这很可能是由于配置设置$config['csrf_regenerate'] = FALSE;
标记可以在每次提交时重新生成(默认)或保留 在CSRF cookie的整个生命周期中都是如此。默认 令牌的再生提供了更严格的安全性,但可能导致 可用性问题,因为其他令牌变得无效(后退/前进 导航,多个选项卡/窗口,异步操作等)。你可以 通过编辑以下配置参数
来改变此行为
所以基本上如果你重新启动启用,每次打开带有表单的新选项卡时都会重新生成cookie。因此,最后打开的最后一个形式将是最后一个设置并拥有唯一有效的CSRF令牌。
示例:
提交时标签1中的表单将失败,而标签2中的表单将失败。