现在的位置: 首页 > 编程开发 > Php > 编程开发 > 正文

Codeigniter开启CSRF protection时 用ajax post提交 报错的解决办法

2015年10月16日 Php, 编程开发 ⁄ 共 1540字 ⁄ 字号 暂无评论

f34b606ada7fbc98d828337db517636e在CI 3.0中有一个csrf(Cross Site Request Forgery) protection的功能
开启了csrf后 由于出于安全考虑 ci3中用ajax post 提交 必须要用到toke 令牌

如果这个扩展打开了的话

POST ajax提交就会报错 我用的nginx 报的403

The action you have requested is not allowed.

大意是

你所要求的行动是不允许的。

会无法执行

这时候要在表单传送的数值中加入一个token的值

才能正常使用表单功能

可以在application/config/config.php中找到下面這几行

$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;

原本$config[‘csrf_protection’]预设是FALSE 改成TRUE就可以打开了 开启之后 会自动帮你在cookie中存一个值 cookie的name在上面说的config.php中可以设定 之后传送表单就要连这个token一起传才行

$(function(){
    $('#btn').click(function(){
        $.ajax({
            type:'POST'
            ,url:'/ajax' //ajax接收的server端
            ,data:$('#form').serialize()+'&csrf_test_name='+ getCookie('csrf_test_name')
            ,success:function(data){
            alert(data.msg);
            }
            ,dataType:'json'
        });
    });
});
 
function getCookie(name){
    var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"));
    if(arr != null) return unescape(arr[2]); return null;
}

getCookie()是用js取出cookie的值

这个js 可以直接拿去用

而csrf_test_name就是在config.php中可以设定的参数

将这个cookie抓出来一起送出表单

就可以正常使用了

最后这个完整的form看上去应该像这样的

$(function(){
$('#btn').click(function(){
$.ajax({
type:'POST'
,url:'/ajax' //ajax接收的server端
,data:$('#form').serialize()+'&csrf_test_name='+ getCookie('csrf_test_name')
,success:function(data){
alert(data.msg);
}
,dataType:'json'
});
});
});

function getCookie(name){
var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"));
if(arr != null) return unescape(arr[2]); return null;
}
getCookie()是用js取出cookie的值
这个js 可以直接拿去用

而csrf_test_name就是在config.php中可以设定的参数
将这个cookie抓出来一起送出表单
就可以正常使用了
最后这个完整的form看上去应该像这样的










如有问题,欢迎留言 大家一起讨论

给我留言

您必须 [ 登录 ] 才能发表留言!

×