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