Php Codeigniter(CSRF)jQuery ajax问题

Php Codeigniter(CSRF)jQuery ajax问题,php,javascript,jquery,ajax,codeigniter,Php,Javascript,Jquery,Ajax,Codeigniter,我在这里遇到了一个问题,当我试图用ajax(post)发布一些东西时,我总是会遇到一个错误。我知道是CSRF给了我这些问题,我一直在努力寻找解决方案。不过,我希望这里有人能帮我 这是我不断得到的错误(来自google chrome inspector) *加载资源失败:服务器响应状态为500(内部服务器错误) XHR已完成加载:http://localhost/woho/ajax/images“* PHP(控制器) Javascript var ID = $(".imageWrap:last")

我在这里遇到了一个问题,当我试图用ajax(post)发布一些东西时,我总是会遇到一个错误。我知道是CSRF给了我这些问题,我一直在努力寻找解决方案。不过,我希望这里有人能帮我

这是我不断得到的错误(来自google chrome inspector)

*加载资源失败:服务器响应状态为500(内部服务器错误) XHR已完成加载:http://localhost/woho/ajax/images“*

PHP(控制器)

Javascript

var ID = $(".imageWrap:last").attr("id");
var baseurl = "http://localhost/woho/";
var doScroll = 1;
var cct = $.cookie('csrf_cookie_name');

if (location.href == baseurl) {
    $(window).scroll(function(){
        if ($(window).scrollTop() > $('body').height() / 2) {
            if(doScroll == 1) {                   
                $.post(baseurl + 'ajax/images',{'id' : ID, 'csrf_token_name': cct}, function(data) {
                    alert(data);
                    $("#wrapper_content").append(data);
                    ID++;
                });
            }
        }
    });
}
javascript中的CCT变量为我提供了正确的令牌或“哈希”,但当javascript发送ajax请求时,codeigniter返回如下错误:

遇到错误。您请求的操作为 不允许

我怎样才能解决这个问题?我是否需要验证控制器中的CSRF令牌或其他内容

我正在使用Codeigniter 2.0.3(javascript):

var ID=$(“.imageWrap:last”).attr(“ID”);
var baseurl=”http://localhost/woho/";
var Doscorl=1;
var cct=$.cookie(“”);
如果(location.href==baseurl){
$(窗口)。滚动(函数(){
如果($(窗口).scrollTop()>$('body').height()/2){
如果(doscorl==1){
$.post(baseurl+'ajax/images',{'id':id',:cct},函数(数据){
警报(数据);
$(“#包装内容”)。追加(数据);
ID++;
});
}
}
});
}

检查/application/config/config.php中的
$config['csrf\u token\u name']
的默认值设置为csrf\u test\u name而不是csrf\u token\u name

如果您不想在Javascript中使用PHP代码,请执行此决定。


此代码工作正常。

如果使用
表单打开(“/some”,“id=”some\u form“)
表单关闭()
,CI将创建一个隐藏输入,以保留csrf\u令牌的名称和值

因此,在AJAX请求中,您可以通过序列化表单并发送表单来获取表单

例如:

<script>
var _form = $("#some_form").serializeArray();
$.ajax({
    data: _form,
    type: 'post',
    url: '<?php echo base_url();?>some',
    async: true,
    success: function(output){
        alert(output);
    },
    complete: function(output){},
    fail: function(err){}
});
</script>

var_form=$(“#某些_form”).serializeArray();
$.ajax({
数据:表格,
键入:“post”,
url:'一些',
async:true,
成功:功能(输出){
警报(输出);
},
完成:函数(输出){},
失败:函数(err){}
});

CSRF一直是我的问题,通过这种方法,它解决了

可能已经晚了,但我发现这个完美的解决方案有点像黑客,但应该能奏效

if (isset($_SERVER["REQUEST_URI"])) 
{
    if(stripos($_SERVER["REQUEST_URI"],'/mypage') === FALSE)
    {
        $config['csrf_protection'] = TRUE;
    }
    else
    {
        $config['csrf_protection'] = FALSE;
    } 
} 
else 
{
    $config['csrf_protection'] = TRUE;
} 
//在config.php文件ci 2中*

找到解决方案只需遵循以下代码:

$.ajax({
    type : 'post',
    url  : 'Your URL',
    data : {
        id: id,
        '<?php echo $this->security->get_csrf_token_name(); ?>' : '<?php echo $this->security->get_csrf_hash(); ?>'
    },
    datatype: 'json',
    success : function(data){}
});
$.ajax({
键入:“post”,
url:“您的url”,
数据:{
id:id,
'' : ''
},
数据类型:“json”,
成功:函数(数据){}
});

我以前也遇到过同样的问题,但现在我已经解决了这个问题

首先,我在header.php中为每个页面创建了csrf_令牌,如下代码所示

$csrf = array(
                'name' => $this->security->get_csrf_token_name(),
                'hash' => $this->security->get_csrf_hash()
        );

<script type="text/javascript">
    var cct = "<?php echo $csrf ['hash']; ?>";
  </script>
$.ajax({
    url:"<?php echo APPPATHS.'staff_leave/leaveapproval/getAppliedLeaveDetails'; ?>",
    data:{id:id,status:status,'<?php echo $this->security->get_csrf_token_name(); ?>': cct},
    method:"post",
    dataType:"json",
    success:function(response)
    {
        alert('success');
    }
});
$csrf=阵列(
'name'=>this->security->get\u csrf\u token\u name(),
'hash'=>this->security->get\u csrf\u hash()
);
var cct=“”;
之后,当我们通过ajax发送特定值时,我们必须发送csrf令牌,如下代码所示

$csrf = array(
                'name' => $this->security->get_csrf_token_name(),
                'hash' => $this->security->get_csrf_hash()
        );

<script type="text/javascript">
    var cct = "<?php echo $csrf ['hash']; ?>";
  </script>
$.ajax({
    url:"<?php echo APPPATHS.'staff_leave/leaveapproval/getAppliedLeaveDetails'; ?>",
    data:{id:id,status:status,'<?php echo $this->security->get_csrf_token_name(); ?>': cct},
    method:"post",
    dataType:"json",
    success:function(response)
    {
        alert('success');
    }
});
$.ajax({
url:“”,
数据:{id:id,状态:status,'':cct},
方法:“张贴”,
数据类型:“json”,
成功:功能(响应)
{
警惕(“成功”);
}
});

我希望这段代码能帮助你,因为这对我很有用。

OMFG,Ofc我需要使用实际的名称,而不是变量。哈哈,老兄,谢谢!Tunnel vision next?顺便说一句,在2.0.3中没有
$this->security->get_csrf_token_name()这样的东西不确定@Alfonso Rubalcava从哪里得到的。我认为这与其他答案相同,包括被接受的答案。
$.ajax({
    url:"<?php echo APPPATHS.'staff_leave/leaveapproval/getAppliedLeaveDetails'; ?>",
    data:{id:id,status:status,'<?php echo $this->security->get_csrf_token_name(); ?>': cct},
    method:"post",
    dataType:"json",
    success:function(response)
    {
        alert('success');
    }
});