查询如何存储和处理框架CSRF令牌

时间:2017-12-29 07:49:50

标签: php codeigniter cakephp frameworks laravel-5.5

我知道CSRF实际上是如何工作的,它通常将随机文本存储在会话中,并且在隐藏令牌CSRF字段中的HTML表单上也是如此。当用户提交表单时,HTML表单标记与会话CSRF匹配并分别进行验证。

怀疑是如果我刷新页面,将生成新的CSRF令牌,并且只有一次有效,直到下一次刷新。在这种情况下,如果我在新选项卡中多次打开相同的表单并提交后续表单,框架或任何人如何在会话中存储令牌并验证它。它是存储最新的令牌还是将存储以数组形式生成的所有新令牌,在验证令牌后它将从会话中删除令牌。

当HTML表单在多个标签页中打开并一个接一个地提交时,我无法获得同一用户的多个令牌的处理方式。

我在控制器中转储会话但根据我的假设无法看到那里的所有令牌。

任何人都可以帮我理解它的处理方式。

2 个答案:

答案 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:表单将标记设置为123,并在隐藏字段中将标记设置为123。 (打开标签2)
  • 选项卡2:选项卡1中的表单在隐藏字段中仍然具有标记123但现在标记为456(重新生成),隐藏字段为456(有效)

提交时标签1中的表单将失败,而标签2中的表单将失败。