Codeigniter ajax CSRF问题

Dex*_*xty 8 javascript ajax codeigniter token

我做了一个简单的自动加载功能,当你在网站上向下滚动时加载内容.但是,当我在Codeigniter中启用CSRF保护时,似乎存在一些问题.

我没有使用表单,所以我不知道当你滚动时我正在做我的帖子请求时如何将令牌从A发送到B.

我的JavaScript

if (location.href == baseurl) {
    $(window).scroll(function(){
        if ($(window).scrollTop() > $('body').height() / 2) {
            if(doScroll == 1) {
                $.post(baseurl + 'ajax/images',{'id' : ID}, function(data) {
                    $("#wrapper_content").append(data);
                    if(data == 'Det finnes ikke flere bilder i databasen, WTF!? Send inn forslag ASAP!') {
                        doScroll = 0;
                    }
                    ID++;
                });
            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

由于Codeigniter期望在所有POST请求中都有TOKEN,因此当CSRF启用时,我无法使其工作.有什么建议?

启用CSRF时出错

无法加载资源:服务器响应状态为500(内部服务器错误)

如果我关闭CSRF,一切都很好......

ims*_*med 13

您可能想尝试我使用过的代码.它很棒:

<script type="text/javascript">
$(function(){
   $('.answerlist').each(function(e){

  $(this).click(function(){

    var valrad = $("input[@name=answer]:checked").val();


    var post_data = {
        'ansid': valrad,
        '<?php echo $this->security->get_csrf_token_name(); ?>' : '<?php echo $this->security->get_csrf_hash(); ?>'
    };

        $.ajax({
                type: "POST",
                url: "<?php echo base_url(); ?>online/checkanswer",
                data: post_data,
                success: function(msg){
                  /// do something 
                }
            });

  });

   });


});


</script>
Run Code Online (Sandbox Code Playgroud)


geo*_*iar 13

正如其他人所说 - 你必须使用AJAX请求参数发布CSFR令牌名称及其值.这是一个简单的解决方案,可以自动将其附加到每个AJAX请求.

这是我在主视图中放置的内容,因此在加载其他javascript文件之前,此代码在每个页面上:

   <script>
     var csfrData = {};
     csfrData['<?php echo $this->security->get_csrf_token_name(); ?>']
                       = '<?php echo $this->security->get_csrf_hash(); ?>';
   </script>
   <!-- ... include other javascript files -->
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

这是我在每个页面上包含的javascript文件的一部分:

$(function() {
    // Attach csfr data token
    $.ajaxSetup({
       data: csfrData
    });
});
Run Code Online (Sandbox Code Playgroud)


Tob*_*ias 10

如果需要,您可以在适当的位置回显令牌名称和哈希值.像这样的东西.

 echo $this->security->get_csrf_token_name()
Run Code Online (Sandbox Code Playgroud)

 echo $this->security->get_csrf_hash()
Run Code Online (Sandbox Code Playgroud)

或者,您可以像往常一样使用form_open()并使用从javascript为您生成的隐藏输入.禁用CSRF功能是错误的方法.