在我的 CodeIgniter Ajax 应用程序中,如果用户的会话已过期并且他们提交一个 Ajax 表单,则由于 CSRF 令牌已过期,服务器会返回 500 错误... 我如何让服务器返回 401 错误,以便我至少可以处理错误并将用户重定向到登录表单?
在我的 CodeIgniter Ajax 应用程序中,如果用户的会话已过期并且他们提交一个 Ajax 表单,则由于 CSRF 令牌已过期,服务器会返回 500 错误... 我如何让服务器返回 401 错误,以便我至少可以处理错误并将用户重定向到登录表单?
允许您手动设置服务器状态标头。例如:
$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秒。如果请求未经授权,则验证令牌毫无意义。
system/Security.php中的csrf_show_error()函数中以确保它否正常工作吗? - Wesley Murch_sanitize_globals()函数,在这个函数中是唯一调用csrf_verify()的地方。希望这可以帮到你,我已经更新了答案但我现在没有更多的想法了。 - Wesley Murch