防止在 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 中防止 SQL 注入的最佳方法是啥 [重复]