当前位置: 首页 > 知识库问答 >
问题:

设置配置项(csrf)在Codeigniter中不工作

苗冯浩
2023-03-14

我只想在我的几个控制器中打开csrf保护,所以我有

function __construct() {

    parent::__construct();
    $this->load->library('form_validation');        
    $this->load->library('tank_auth');
    $this->load->helper(array('form', 'url'));
    $this->load->model('user_model', '', true);

    $this->config->set_item('csrf_protection', TRUE);

}

但它似乎不起作用,尽管当我在页面上执行var_dump($this->config)时,它显示csrf_protection为TRUE,但未设置cookie,并且表单有一个没有值的隐藏字段

Csrf令牌名称和cookie名称都已设置,表单使用form_open()调用。

任何帮助都将不胜感激。

更新:因此从版本2.1.1开始,这是不可能的,因为安全类构造中的行if(config_item('csrf_protection')===TRUE){

安全类是在控制器之前初始化的,因此控制器中的配置项更改自然不会对它产生影响。

共有1个答案

楚承天
2023-03-14

我有个办法给你。创建一个自定义应用程序/core/my_security.php并将其放入:

<?php if ( !defined( 'BASEPATH' ) ) exit( 'No direct script access allowed' );

class MY_Security extends CI_Security
{
    public function csrf_verify( )
    {
        foreach ( config_item('csrf_excludes') as $exclude )
        {
            $uri = load_class('URI', 'core');
            if ( preg_match( $exclude, $uri->uri_string() ) > 0 )
            {
                // still do input filtering to prevent parameter piggybacking in the form
                if (isset($_COOKIE[$this->_csrf_cookie_name]) && preg_match( '#^[0-9a-f]{32}$#iS', $_COOKIE[$this->_csrf_cookie_name] ) == 0)
                {
                    unset( $_COOKIE[$this->_csrf_cookie_name] );
                }
                return;
            }
        }
        parent::csrf_verify( );
    }
}

这将检查您需要在CSRF部分的application/config.php中放入的下列排除:

$config['csrf_excludes'] = array
    ( '@^/?excluded_url_1/?@i'
    , '@^/?excluded_url_2/?@i' );

每个匹配的URL模式都将被排除在CSRF检查之外。您可以在http://rubular.com构建正则表达式

干杯

 类似资料:
  • 我正在使用CodeIgniter3.0。6.目前正在一页网站上工作,该网站具有搜索功能。我在codeigniter的配置文件中启用了csrf_保护选项,并使用form_open()函数创建表单。 当我按下submit按钮时,搜索功能运行良好,但在提交表单后,当我刷新页面时(使用任何刷新页面的功能,如从keybord或浏览器刷新),CSRF不工作,并显示错误“您请求的操作不允许”。 注意:我使用po

  • 问题内容: 我在代码点火器中具有这样的目录结构: 当我在index.php中访问图像时,我使用了: href为: 我认为在代码点火器中访问图像或库时,最好不要包含。所以,我试图改变 在 以 现在,我更新了图像源和其他库源,删除了本地主机和目录文件夹的名称: 但是我得到了错误。它说找不到对象。可以帮我吗? 问题答案: 在Config.php中 进入(外部应用程序文件夹) - 在URL中删除 访问UR

  • 问题内容: 我正在使用codeigniter在php项目中。请告诉我为php和mysql设置时区的全局方法是什么。我可以在哪个文件中进行设置。我想将其设置为不包含php.ini和.htaccess文件。 目前我在每次输入之前都在使用它-: 问题答案: 将其放置在基本网址上方的config.php上也可以 PHP 支持的时区列表 application / config.php 我发现使用满的另一种

  • 在我的项目中,我试图为管理员创建一个部分。下列的http://philsturgeon.co.uk/blog/2009/07/Create-an-Admin-panel-with-CodeIgniter#top 我试了第二种方法。根据它,我的文件夹结构更改为类似这样。 我已经创建了一个控制器索引。php内置控制器/admin,代码如下: 和内部视图/管理我已经创建了一个文件index.php并呼应

  • 我试图在codeigniter中设置会话。当某人尝试使用电子邮件id和密码登录时。 1)使用电子邮件id查找他/她的角色。然后在会话中返回该结果并重定向到相应的链接。我在下面键入的代码。你能解决这个问题吗? 控制器 模型

  • 问题内容: 最近,我发现了有关CSRF攻击的信息,并很高兴发现Codeigniter v 2.0.0中添加了CSRF保护。 我启用了该功能,并看到在表单中添加了带有令牌的隐藏输入,并且我假设它也在会话中存储了令牌。在POST请求中,CI是否会自动比较令牌,还是必须手动进行比较? 问题答案: 仅当使用此功能时,CSRF令牌才作为隐藏输入添加到表单中。 由Security类创建具有CSRF令牌值的co