Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Codeigniter CSRF-它是如何工作的_Php_Security_Codeigniter_Token - Fatal编程技术网

Php Codeigniter CSRF-它是如何工作的

Php Codeigniter CSRF-它是如何工作的,php,security,codeigniter,token,Php,Security,Codeigniter,Token,最近我发现了CSRF攻击,并且很高兴地发现Codeigniter V2.0.0中添加了CSRF保护 我启用了该功能,并看到在表单中添加了带有令牌的隐藏输入,我假设它也将令牌存储在会话中。在POST请求中,CI是否会自动比较令牌,还是必须手动进行比较?只有在使用form\u open()函数时,CSRF令牌才会作为隐藏输入添加到表单中 具有CSRF令牌值的cookie由安全类创建,并在必要时为每个请求重新生成 如果$\u POST数据存在,则输入类会自动验证cookie。如果发布的令牌与cooki

最近我发现了CSRF攻击,并且很高兴地发现Codeigniter V2.0.0中添加了CSRF保护


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

只有在使用
form\u open()
函数时,CSRF令牌才会作为隐藏输入添加到表单中

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

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

所以基本上,它是全自动的-您所要做的就是在
$config['csrf\u protection']
中启用它,并为表单使用
form\u open()
函数


我发现一篇很好的文章对此做了很好的解释:

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

请参阅此链接--

本文解释了如何在中使用CSRF令牌

  • 使用表单助手打开表单
    form\u open()
    函数
  • 以ajax形式
  • ajax/jquery序列化表单

本文还解释了如何“禁用cetain URL的CSRF(用作Web服务URL)

对于codeigniter4您可以通过更改
应用程序/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\u open()
将自动在表单中插入一个隐藏的csrf字段。如果没有,则可以使用始终可用的
csrf\u令牌()
csrf\u哈希()
函数

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


感谢您的澄清!我很高兴我选择了CI作为我的框架:)谢谢,但是这个链接是非常完美和有用的答案。通过正确的方向节省了很多时间。谢谢你,先生@WesleyMurch我想知道您是否指的是保存在客户端的cookie。用户不能操纵这些cookie以使其对用户有利吗?