Codeigniter CSRF - 它是如何工作的

时间:2011-06-05 17:46:19

标签: php security codeigniter token

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

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

4 个答案:

答案 0 :(得分:36)

只有在使用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

答案 1 :(得分:3)

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

本文解释了如何在

中使用CSRF令牌
  • 使用表单助手form_open()函数
  • 打开表单
  • in ajax forms
  • ajax / jquery序列化表格

本文还介绍了如何“禁用CSRF for cetain URL(用作网络服务网址)

答案 2 :(得分:2)

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

答案 3 :(得分:0)

对于 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" />