CodeIgniter 4结合Ajax出现CSRF错误:The action you requested is not allowed如何解决?
解决CodeIgniter 4 + Ajax开发中CSRF触发的"The action you requested is not allowed"错误
在CodeIgniter 4结合Ajax开发时,常会遇到CSRF保护机制触发的错误提示:The action you requested is not allowed.,对应的错误日志如下:
CRITICAL - 2023-06-10 03:41:17 --> The action you requested is not allowed. in SYSTEMPATH/Security/Security.php on line 306. 1 SYSTEMPATH/Security/Security.php(306): CodeIgniter\Security\Exceptions\SecurityException::forDisallowedAction() 2 SYSTEMPATH/Filters/CSRF.php(55): CodeIgniter\Security\Security->verify(Object(CodeIgniter\HTTP\IncomingRequest)) 3 SYSTEMPATH/Filters/Filters.php(173): CodeIgniter\Filters\CSRF->before(Object(CodeIgniter\HTTP\IncomingRequest), null) 4 SYSTEMPATH/CodeIgniter.php(473): CodeIgniter\Filters\Filters->run('api/v1/notification/markasseen/4', 'before') 5 SYSTEMPATH/CodeIgniter.php(368): CodeIgniter\CodeIgniter->handleRequest(null, Object(Config\Cache), false) 6 FCPATH/index.php(68): CodeIgniter\CodeIgniter->run()
我自己开发时也碰到过这个问题,下面分享几个可行的解决方案:
确保Ajax请求携带CSRF令牌
首先在页面的<head>中添加meta标签输出当前CSRF令牌:<meta name="csrf-token" content="<?= csrf_hash() ?>">然后在Ajax请求中通过请求头或者表单数据携带令牌,以jQuery为例:
$.ajax({ url: '/api/v1/notification/markasseen/4', method: 'POST', headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }, data: { // 你的业务数据 }, success: function(res) { // 处理响应逻辑 } });调整CSRF配置排除特定路由
如果你的API路由不需要CSRF保护(比如对外公开的接口),可以在app/Config/Security.php中配置$csrfExcludeURIs,把目标路由加进去:public $csrfExcludeURIs = [ 'api/v1/notification/markasseen/*' ];同时确认
$csrfProtection的设置,默认是'cookie',这个配置适配大多数场景。检查请求方式与令牌有效性
- CodeIgniter的CSRF保护默认只作用于POST/PUT/DELETE等修改类请求,GET请求不会触发检查,确认你的请求方式是否符合预期;
- 令牌有有效期,默认2小时,若需要调整可以修改
Security.php中的$csrfExpire参数,单位是秒。
内容的提问来源于stack exchange,提问作者Obot Ernest
相关产品推荐
相关产品推荐

