Codeigniter csrf过期令牌

时间:2011-06-05 04:26:31

标签: codeigniter

在我的codeigniter ajax应用程序中,如果用户的会话超时且他们提交了ajax表单,因为csrf令牌已过期,服务器返回500错误...如何让服务器返回401错误而不是所以我至少可以处理错误并将用户重定向到登录表单?

1 个答案:

答案 0 :(得分:2)

使用Output class。来自用户指南:

  

$ this-> output-> set_status_header(code,'text');

     

允许您手动设置服务器状态标头。例如:

$this->output->set_status_header('401');
// Sets the header as: Unauthorized

我打算建议扩展Security类并覆盖生成CSRF错误的函数:

/**
 * Show CSRF Error
 *
 * @return  void
 */
public function csrf_show_error()
{
    //show_error('The action you have requested is not allowed.');

    // Set 401 header instead of the default 500
    show_error('The action you have requested is not allowed.', 401);
}

...但这并不总是正确的 - 最重要的是,我认为在提交令牌时你不需要这样做。在甚至验证了令牌之前,您应该已经发送了未经授权的标头

来自你的评论:

  

并不是csrf令牌与会话直接相关,而是两者的默认到期时间相同。因此,如果用户暂时没有刷新浏览器,然后刷新页面,CI将更新会话和csrf令牌....但是使用ajax,因为它无法刷新令牌,它只返回500错误。

如果这是阻止您在CSRF令牌之前验证会话的唯一因素,请尝试将会话令牌设置为比令牌早10秒到期。如果请求未经授权,则无需先验证令牌。