为什么codeigniter2不以更安全的方式存储csrf_hash,例如会话?

2024-04-22

为什么生成的 CSRF 保护令牌没有像建议的那样通过 SESSION 保存和使用here http://codeutopia.net/blog/2008/10/16/how-to-csrf-protect-all-your-forms/?目前在CI2中,CSRF保护机制(Security类)是这样的:

1.在_csrf_set_hash()函数中为CSRF令牌生成唯一值:

$this->csrf_hash = md5(uniqid(rand(), TRUE));

2.将该标记插入表单隐藏字段(使用 form_open 助手)

3.用户提交表单,服务器通过POST获取令牌。 CI 在 Input 类中的“_sanitize_globals()”函数中执行令牌验证:

$this->security->csrf_verify();

4.Security类的函数“csrf_verify”只是检查是否设置了POST['token']并且POST['token']等于COOKIE['token'];

public function csrf_verify(){

// If no POST data exists we will set the CSRF cookie
if (count($_POST) == 0)
{
    return $this->csrf_set_cookie();
}

// Do the tokens exist in both the _POST and _COOKIE arrays?
if ( ! isset($_POST[$this->_csrf_token_name]) OR
         ! isset($_COOKIE[$this->_csrf_cookie_name]))
{
    $this->csrf_show_error();
}

// Do the tokens match?

if ($_POST[$this->_csrf_token_name] != $_COOKIE[$this->_csrf_cookie_name])
{
    $this->csrf_show_error();
}

// We kill this since we're done and we don't want to
// polute the _POST array
unset($_POST[$this->_csrf_token_name]);

// Nothing should last forever
unset($_COOKIE[$this->_csrf_cookie_name]);
$this->_csrf_set_hash();
$this->csrf_set_cookie();

log_message('debug', "CSRF token verified ");

return $this;
}

为什么不在会话中存储令牌?恕我直言,仅检查 POST['token'] 非空且等于 COOKIE['token'] 是不够的,因为两者都可能是由邪恶站点发送的。


有几个原因。

首先,将令牌存储在 cookie 中并不是不安全的。反 CSRF 并不是为了防止自动发布内容而设计的,而是为了防止以经过身份验证的用户身份伪造请求(通过 iframe 或简单链接)。只要令牌本身是不可猜测的,就足够了。

第二个是如果它存储在会话中,那么您需要启用会话,这也会导致可用性问题,因为如果您的会话超时并且您打开了一个包含表单的页面,您将无法再提交该表单(即使表单本身不需要登录状态)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么codeigniter2不以更安全的方式存储csrf_hash,例如会话? 的相关文章

  • AES 在汇编中的实现 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 大家好 我正在尝试构建一个代码来演示
  • Facebook“喜欢”按钮,喜欢另一个页面/URL

    我有一个链接列表 每个单独的页面上都有一个 喜欢 按钮来 喜欢 该页面 但我想要列表中每个链接旁边有一个 喜欢 按钮 该按钮会喜欢旁边链接的 URL 就像单击链接然后单击 喜欢 按钮一样 我该怎么做呢 要在每个单独的页面上创建按钮 我使用以
  • PHP:会话 |无法解码会话对象

    我尝试将电子商务功能添加到遗留项目中 因此我仍然需要旧的会话处理程序 我使用 PHP v7 1 14 和 Session2DB https github com voku session2db tree 4 0 0 https github
  • 多个where条件codeigniter

    如何将此查询转换为活动记录 UPDATE table user SET email email last ip last ip where username username and status status 我尝试将上面的查询转换为 d
  • 如何在 PHP 中进行静态代码分析? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有PHP源文件的静态分析工具 二进制文件本身可以检查语法错误 但我正在寻找功能更多的东西 例如 未使用的变量赋值 未先初始化就分配到的
  • 致命错误:调用未定义的方法 mysqli_stmt::query()

    为什么我会收到以下错误 致命错误 调用未定义的方法 mysqli stmt query mysqli new mysqli localhost or die mysqli gt connect error function checklog
  • 使用 PHP DOMDocument 更改标签属性值

    我想用 PHP DOMDocument 更改标签属性的值 例如 假设我们有这行 HTML a href http foo bar Click here a 我将上面的代码加载到 PHP 中 如下所示 dom new domDocument
  • 使用 PHP SDK 获取页面的最新 Facebook 帖子

    以下代码位于名为 facebook posts php 的文件内 我从索引文件中调用该文件 如下所示 然而 这段代码放到哪里 却没有任何反应 因此 成功和捕获错误都不会返回错误 正如我所见 我尝试过绝对网址 但这也不起作用 我隐藏了 api
  • laravel 5:找不到类“输入”

    In my routes php我有的文件 Route get function return view login Route get index function return view index Route get register
  • 捕获动态表中 HTML 元素的值

    我有从数据库生成的以下动态表
  • 根据客户端发送 HTML 或 JSON 响应

    我有一个带有 Eloquent 实体及其各自的 Laravel 应用程序RESTful 资源控制器 http laravel com docs 5 0 controllers restful resource controllers 如下所
  • 通过另一个二维数组中的行过滤二维数组的行

    我有两个数组 我正在使用array diff assoc 以获得差异 但它总是返回common set结果中的行 它应该返回new q sets排 我的方法有什么问题吗 样本数据 array1 12 gt new q sets 11 gt
  • 有没有办法获取 PHP 中可用区域设置的列表?

    在Java中 你可以调用Locale getAvailableLocales 获取可用区域设置的列表 我期待 PHP 的同等功能Locale http php net manual en class locale php类 但找不到 有没有
  • PHP 对象创建和内存使用

    一个基本的虚拟类 class foo var bar 0 function foo function boo echo memory get usage echo n foo new foo echo memory get usage ec
  • 为 foreach() 提供的参数无效..Wordpress

    突然开始出现以下代码的错误 img src title 有时分类 贷款俱乐部 是空的 这可能是问题所在吗 如果是这样 有人可以指出我正确的代码吗 Add if之前的情况foreach
  • 如何为移动应用程序创建无密码登录

    我有兴趣在移动应用程序和 API 之间构建某种无密码登录 假设我可以控制两者 动机是必须登录对用户来说非常烦人并且存在安全风险 例如 用户将重复使用现有密码 我希望用户能够立即开始使用该应用程序 我想知道是否有一些可行的技术 例如 在移动设
  • PHP filesize() 适用于除一个文件之外的所有文件,给出 stat failed 错误

    我正在编写一个 PHP 页面 该页面通过抓取现有 HTML 页面来生成播客提要 一切正常 但我的 mp3 文件之一出现 filesize stat failed 错误 据我所知 该文件没有损坏 并且播放得很好 我还将文件重新上传到服务器 它
  • 创建具有动态更新变量的数组

    我有一些 PHP 变量 它们的名称直接链接到它们包含的函数 是否有办法自动创建这些变量 以便我可以使用所有变量 00 200 这就是我现在正在做的事情 regdays00 is user reg matured 00 regdays02 i
  • cakephp 3.0 如何使用值而不是 id 填充选择字段

    我一直在寻找以前的答案 但我找到的答案与旧的 cakephp 版本有关 我有两个表 杂志 和 问题 其中存在关系 问题 属于 杂志 问题表如下所示 public function initialize array config this g
  • 我应该写什么来从 CI 中的控制器重定向页面?

    这是我的控制器

随机推荐

  • Git 在两个远程之间同步

    我正在使用如下基础设施 我的笔记本电脑 工作站 B 和服务器 B 都在我的工作中 现在为了允许在家工作 我希望能够在工作站 A 上工作 我的笔记本电脑是唯一可以同时连接到两台服务器的设备 因为我在家里设置了 VPN 在当前的项目中 我们正在
  • SQL查找表中第一次出现的数据集

    假设我有一张桌子 CREATE TABLE T TableDTM TIMESTAMP NOT NULL Code INT NOT NULL 我插入一些行 INSERT INTO T TableDTM Code VALUES 2011 01
  • 每次包含同一个文件时都会对其进行标记吗?

    这个问题是关于PHP解析引擎的 当我在单个运行时中多次包含一个文件时 PHP 是否每次都会对其进行标记 或者是否保留缓存并仅在后续包含时运行已编译的代码 EDIT 更多细节 我没有使用外部缓存机制 我正在处理same文件被多次包含在同一个请
  • 如何加载使用 VaryByControl OutputCache 的控件,并指定属性值

    我有一个应该使用缓存的用户控件 其中VaryByControl The ascx文件看起来像这样 p Nothing p The TestControl代码隐藏文件中的类有一个int Test 财产和Page Load 填充的事件处理程序S
  • 线程 1:信号 SIGABRT

    当我为 Xcode 项目运行模拟时出现上述错误 这出现在 O abort with payload 文件中 dyld abort with payload 0x10aae66f8 lt 0 gt movl 0x2000209 eax imm
  • 为什么使用“==”或“is”比较字符串有时会产生不同的结果?

    两个字符串变量设置为相同的值 s1 s2总是返回True but s1 is s2有时返回False 如果我打开 Python 解释器并执行相同的操作is对比一下 成功了 gt gt gt s1 text gt gt gt s2 text
  • Python默认继承?

    如果我在Python中定义一个类 例如 class AClass slots a b c 它继承自哪个类 貌似没有继承object 如果定义一个类并且不声明任何特定的父类 则该类将成为 经典类 其行为与从对象继承的 新式类 略有不同 请参阅
  • 半素数分解的最佳算法是什么?

    半素数分解的最佳算法是什么 它可能与多重保理不同 对半素数进行因式分解的方式与对任何合数进行因式分解的方式相同 使用试除法和 pollard rho 来获得容易实现的目标 如果有的话 然后 p 1 p 1 和椭圆曲线 直到您确信因子太大 用
  • 仅西里尔文输入文本形式

    如何将输入文本限制为仅在 Web 表单文本框中输入Cyrillic人物 首先 您应该对页面和脚本使用支持西里尔字符 例如 UTF 8 的编码 然后 您可以使用正则表达式来检查 input keyup function this value
  • 为什么 ASP.NET DropDownList 控件需要单击两次才能在 Internet Explorer 中展开

    我有一个 ASP NET DropDownList 控件 它呈现到页面上的下拉列表 选择 HTML 标记 中 由于某种原因 当我使用 Internet Explorer 时 需要单击两次才能打开它并查看选项 这对最终用户来说只是额外的单击
  • 为什么使用成员数组而不是常量表达式调用 constexpr 函数?

    我有以下辅助功能 template
  • Codeigniter htaccess 和 base_url

    我安装了 codeigniter 并开始在上面编写一些代码 首先我想删除 index php 并对其进行一些研究 我用下面的一个小 htaccess 代码将其删除 RewriteEngine on RewriteCond 1 index p
  • link_to_remote 是否有等效的 :disable_with ?

    我有一个 link to remote 我想确保人们在等待它返回时只能单击它一次 有没有什么好的方法可以在有人点击后禁用它 更改链接的文本也很好 但我也想禁用它以确保 顺便说一句 这是 Ruby on Rails 您无法禁用链接 但您可以更
  • 在文件夹的上下文菜单中运行批处理文件

    当我右键单击任何文件夹时 我想运行此批处理文件 setenv cmd echo off SET CPLUS INCLUDE PATH C mingw32 include C mingw32 lib gcc mingw32 4 9 2 inc
  • 为什么create系统调用叫creat? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • RestKit 0.20.0pre5:每个请求的 HTTP 标头

    我想发送一个If Modified Since带有 GET 请求的 http 标头 由 RKObjectManager getObjectsAtPath the 迁移指南 https github com RestKit RestKit w
  • Maven 错误:也许您正在 JRE 而不是 JDK 上运行?

    我以前从未使用过 Maven 我正在按照说明进行操作here http ecmarchitect com alfresco developer series tutorials maven sdk tutorial tutorial htm
  • 使用类型类将 Haskell 中的值与类型关联起来

    我想使用类型类返回String功能上依赖于 Haskell 类型的实例 例如 假设我们有这样的类型Form 我想将字符串 form 与此类型相关联 给定类型Invocation 我想关联字符串 job 等等 重要的是我通常不会有相关类型的实
  • Shell 脚本读取缺少最后一行

    我的 bash shell 脚本有一个奇怪的问题 我希望能对此有所了解 我的团队正在开发一个脚本 该脚本会迭代文件中的行并检查每一行中的内容 我们遇到了一个错误 当通过将不同脚本排序在一起的自动化流程运行时 看不到最后一行 用于迭代文件中的
  • 为什么codeigniter2不以更安全的方式存储csrf_hash,例如会话?

    为什么生成的 CSRF 保护令牌没有像建议的那样通过 SESSION 保存和使用here http codeutopia net blog 2008 10 16 how to csrf protect all your forms 目前在C