首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询框架CSRF token的存储和处理方式

查询框架CSRF token的存储和处理方式
EN

Stack Overflow用户
提问于 2017-12-29 15:49:50
回答 2查看 225关注 0票数 0

我知道CSRF实际上是如何工作的,它通常将随机文本存储在会话中,并在HTML表单的隐藏令牌CSRF字段中具有相同的内容。当用户提交表单时,HTML表单令牌分别匹配会话CSRF和validate。

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

当HTML表单在多个选项卡中打开并逐个提交时,我无法获得如何处理同一用户的多个令牌。

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

有谁能帮我理解它是如何处理。

EN

回答 2

Stack Overflow用户

发布于 2017-12-29 16:52:27

我使用https://github.com/Vundo/CSRF

它是如此简单,它可以得到

代码语言:javascript
复制
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>

提交后的接收页面:

代码语言:javascript
复制
$session_start();
if(isset($_POST['xxxxxxx'])) {
    if(!CSRF::check($_POST['_token'])){
        exit('Wrong Token!');
    }
票数 0
EN

Stack Overflow用户

发布于 2017-12-29 18:10:50

在CodeIgniter中,您每次打开一个表单,或者在您的例子中,打开一个新的选项卡(您指的是浏览器选项卡,对吗?)你会得到一个代币。此令牌被存储,并使用form_open输出到隐藏输入。在提交时,它会检查以确保存储的令牌和表单令牌相同。这是一个非常简单的过程,就像halojoy概述的那样。

您在评论中表示,尽管在不同的选项卡中打开了多个表单,但您仍然可以提交表单,而不会出现CSRF错误。这很可能是由于配置设置$config['csrf_regenerate'] = FALSE;造成的

令牌可以在每次提交时重新生成(默认),或者在CSRF cookie的整个生命周期中保持不变。令牌的默认重新生成提供了更严格的安全性,但可能会导致可用性问题,因为其他令牌变得无效(后退/前进导航、多个选项卡/窗口、异步操作等)。您可以通过编辑以下配置参数来更改此行为

因此,基本上,如果您启用了重新生成,那么每次您打开一个带有表单的新选项卡时,cookie都会重新生成。因此,最后打开的表单将是最后设置的表单,并且具有唯一有效的CSRF令牌。

示例:

  • 页签1:表单将token设置为123,在隐藏字段中获取token为123。(打开选项卡2)
  • 选项卡2:选项卡1中的表单在隐藏字段中仍具有标记123,但现在标记为456 (重新生成),隐藏字段为456 (有效)

提交时选项卡%1中的表单将失败,而选项卡%2中的表单将成功。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48019314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档