防止在 Codeigniter 中显示默认的 CSRF 错误页面

Posted

技术标签:

【中文标题】防止在 Codeigniter 中显示默认的 CSRF 错误页面【英文标题】:Prevent from displaying the default CSRF error page in Codeigniter 【发布时间】:2013-01-02 15:15:10 【问题描述】:

我不喜欢 CSRF 令牌过期时 CI 默认的行为方式。例如,当用户显示登录表单很长时间后,当他们最终提交时,就会出现这个带有错误消息的丑陋空白页面。

我询问了解决这个问题的方法,有人告诉我扩展 Security 类,并重写它的 csrf_show_error() 方法,如下所示:

class MY_Security extends CI_Security 


    public function __construct()
    
        parent::__construct();

    

    public function csrf_show_error()
    
        // comment out the default action
        // show_error('The action you have requested is not allowed.');

        // add redirect actions here
        // I'd like to use some helper function here like redirect()

    

 

问题是我不能,或者我不知道如何从这里访问库和帮助程序,以执行重定向。我无法在此处使用 get_instance() 函数,因为出现错误。那么,我还能做什么?或者有没有其他更好的选择来防止显示这个错误页面?

【问题讨论】:

如果您无法访问类中的辅助函数来执行重定向,那么您始终可以通过设置header() 重定向和设置正确的 HTTP 状态代码等来执行辅助函数的工作。 这很神秘。这是我最后一张牌。但是最好使用已经实现的代码。一个简单的 redirect(current_url()) 会很棒。但我也想避免硬编码在我的自定义类中包含 URL 帮助器。 【参考方案1】:

一种方法是扩展Security 类以重定向到同一页面。

CodeIgniter 用户指南 - Extending Core Class

How to handle an expired CSRF token after a page is left open很好的解释

【讨论】:

【参考方案2】:

想要更改页面视图的用户可以在/application/errors/error_general.php 中编辑文件error_general.php。 CodeIgniter 使用该文件来显示一般错误,例如 CSRF 错误。

问候:)。

【讨论】:

如果您的网站使用模板和视图,这很值得了解,但不是很有帮助,因为error_general.php 是一个完整的页面。【参考方案3】:

CI_Security 等核心类在帮助程序和库之前实例化 - 无法像在 CI 应用程序的其他地方那样使用这些函数。

您必须使用像 header() 这样的原生 PHP 函数来复制类中的功能,如果您只是想重定向到更漂亮的错误页面,这并不难。

【讨论】:

header('Location: ' . htmlspecialchars($_SERVER['REQUEST_URI'])); 使用经过清理的 URI 刷新页面。

以上是关于防止在 Codeigniter 中显示默认的 CSRF 错误页面的主要内容,如果未能解决你的问题,请参考以下文章

在 CodeIgniter 中重新路由页面时如何防止重复内容?

CodeIgniter 防止XSS攻击

雷林鹏分享:CodeIgniter 防止XSS攻击

在 CodeIgniter 中防止 SQL 注入的最佳方法是啥 [重复]

如果未提供 URL 中的参数,则 codeigniter 显示警告错误

CodeIgniter 只执行默认控制器