Codeigniter CSRF响应格式

时间:2012-11-22 07:29:41

标签: json codeigniter csrf

我正在为我的所有ajax调用使用预定义的响应格式。

如果请求是success,则服务器将响应:

{"status":true,"data":{"name":"person","age":2}}

请注意data没有必要。

如果请求失败,那么我将获得

{"status":false,"reason":"You are not authorised."}

因此,每个回复都有一个status字段,如果状态为FALSE,则会有reason字段。

问题是现在我在Codeigniter中启用CSRF保护,如果令牌过期/失败,系统输出

The action you have requested is not allowed.

这是HTML内容。

是否可以扩展安全类,以便如果请求是通过Ajax,那么它将保持json_encoded格式,否则使用html格式。(我不想修改核心)

感谢。

1 个答案:

答案 0 :(得分:2)

此错误消息是从CI_Exceptions::show_error方法(位于system / core中)呈现的。您可以通过常规方式extend this class并覆盖此方法以捕获此错误并返回您想要的任何内容。

你可以通过覆盖它来摆脱CI_Security::csrf_show_error方法中的调用,这样它就不会简单地调用

show_error('The action you have requested is not allowed.');

这可能更强大。

或者你可以攻击CI_Exceptions课程内的这个。由于此错误没有特定的错误代码,因此您必须匹配可能在更新之间中断的消息(currently hardcoded)。结果类可能如下所示:

class MY_Exceptions extends CI_Exceptions {
    public function show_error($heading, $message, $template = 'error_general', $status_code = 500) {
        if ($message == 'The action you have requested is not allowed.') {
            // handle this error your way
        } else {
            // send every other error to the original handler
            parent::show_error($heading, $message, $template, $status_code);
        }
    }
}