Codeigniter CSRF - 它是如何工作的

Posted

技术标签:

【中文标题】Codeigniter CSRF - 它是如何工作的【英文标题】:Codeigniter CSRF - how does it work 【发布时间】:2011-09-08 20:03:40 【问题描述】:

最近我发现了 CSRF 攻击,很高兴发现 Codeigniter v 2.0.0 中添加了 CSRF 保护。

我启用了该功能,并看到带有令牌的隐藏输入被添加到表单中,我假设它也将令牌存储在会话中。在 POST 请求中,CI 是自动比较令牌还是我必须手动进行比较?

【问题讨论】:

【参考方案1】:

仅当使用form_open() 函数时,CSRF 令牌才会作为隐藏输入添加到表单中。

具有 CSRF 令牌值的 cookie 由 Security 类创建,并在必要时为每个请求重新生成。

如果存在$_POST 数据,则输入类会自动验证cookie。如果发布的令牌与 cookie 的值不匹配,CI 将显示错误并无法处理 $_POST 数据。

所以基本上,它都是自动的 - 您所要做的就是在您的 $config['csrf_protection'] 中启用它并为您的表单使用 form_open() 函数。

我发现一篇很好的文章,解释得很好:https://beheist.com/blog/csrf-protection-in-codeigniter-2-0-a-closer-look.html

【讨论】:

感谢您的澄清!我很高兴我选择 CI 作为我的框架 :) 谢谢,但链接已失效 完美而有帮助的答案。通过正确的方向节省了很多时间。谢谢楼主! @WesleyMurch 我想知道您是否指的是保存在客户端的 cookie。用户不能操纵这些 cookie 来为他们服务吗?【参考方案2】:

参考此链接 -- Used CSRF Tokens using form helper or Manually

文章解释了如何在

中使用 CSRF 令牌 使用表单助手form_open() 函数打开表单 ajax 形式 ajax/jquery 序列化表单

本文还解释了如何“为某些 URL 禁用 CSRF(用作 Web 服务 URL)

【讨论】:

【参考方案3】:

当启用 csrf 保护时,安全类会自动检查此令牌(它将 POST 令牌与 COOKIE 令牌进行比较)

【讨论】:

【参考方案4】:

对于 codeigniter4 您可以通过更改 app/Config/Filters.php 并全局启用 csrf 过滤器来启用 CSRF 保护:

public $globals = [
        'before' => [
                //'honeypot'
                'csrf'
        ]
];

这里改名字app/Config/App.php

/*
    |--------------------------------------------------------------------------
    | Cross Site Request Forgery
    |--------------------------------------------------------------------------
    | Enables a CSRF cookie token to be set. When set to TRUE, token will be
    | checked on a submitted form. If you are accepting user data, it is strongly
    | recommended CSRF protection be enabled.
    |
    | CSRFTokenName   = The token name
    | CSRFHeaderName  = The header name
    | CSRFCookieName  = The cookie name
    | CSRFExpire      = The number in seconds the token should expire.
    | CSRFRegenerate  = Regenerate token on every submission
    | CSRFRedirect    = Redirect to previous page with error on failure
    */
    //public $CSRFTokenName  = 'csrf_test_name';
    public $CSRFTokenName  = 'form_csrf';
    public $CSRFHeaderName = 'X-CSRF-TOKEN';
    public $CSRFCookieName = 'csrf_cookie_name';
    public $CSRFExpire     = 7200;
    public $CSRFRegenerate = true;
    public $CSRFRedirect   = true;

如果您使用表单助手,那么form_open() 将自动在您的表单中插入一个隐藏的 csrf 字段。如果没有,那么您可以使用始终可用的 csrf_token()csrf_hash() 函数

helper('form');//::::Load form helper

echo form_open('/u/sign-up', ['csrf_id' => 'my-id']);

将返回:

<form action="http://example.com/index.php/u/sign-up" method="post" accept-charset="utf-8">
    <input type="hidden" id="my-id" name="form_csrf" value="964ede6e0ae8a680f7b8eab69136717d" />

【讨论】:

以上是关于Codeigniter CSRF - 它是如何工作的的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter:这种情况下 csrf 不工作

Codeigniter:Paypal IPN 和 csrf_protection

如果我从CodeIgniter表单复制csrf令牌,则表单成功提交

Codeigniter CSRF 问题

Codeigniter CSRF 保护 VS 选项卡

在没有表格的情况下获取 Codeigniter CSRF 令牌?