【问题标题】:Codeigniter (CSRF) jQuery ajax problemCodeigniter (CSRF) jQuery ajax 问题
【发布时间】:2011-11-13 04:33:58
【问题描述】:

我在这里遇到了一个问题,当我尝试使用 ajax (POST) 发布内容时,我不断收到错误消息。我知道是 CSRF 给我带来了这些问题,我一直在反复尝试寻找解决方案。但是,我希望这里有人可以帮助我!

这是我不断收到的错误(来自 google chrome 检查器),

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

PHP(控制器)

class Ajax extends CI_Controller {

    function images() {

        echo 'Hello World';

    }

}

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 var 给了我正确的令牌或“哈希”,但是当 javascript 发送 ajax 请求时,codeigniter 返回一个错误,例如,

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

我该如何解决这个问题?我需要在我的控制器中验证 CSRF 令牌或其他东西吗?

我正在使用 Codeigniter 2.0.3

【问题讨论】:

  • 顺便说一句,在 2.0.3 中没有 $this->security->get_csrf_token_name(); 这样的东西 @Alfonso Rubalcava 不知道从哪里得到的。

标签: php javascript jquery ajax codeigniter


【解决方案1】:

试试(javascript):

var ID = $(".imageWrap:last").attr("id");
var baseurl = "http://localhost/woho/";
var doScroll = 1;
var cct = $.cookie("<?php echo $this->config->item("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,'<?php echo $this->security->get_csrf_token_name(); ?>': cct}, function(data) {
                    alert(data);
                    $("#wrapper_content").append(data);
                    ID++;
                });
            }
        }
    });
}

【讨论】:

  • OMFG,Ofc 我需要使用实际名称,而不是 var。哈哈,大佬,谢谢!接下来是隧道视觉?
【解决方案2】:

检查 /application/config/config.php 中 $config['csrf_token_name'] 的默认值设置为 csrf_test_name 而不是 csrf_token_name

这个决定如果你不想在 Javascript 中使用 PHP 代码。

$.ajax({
    url: 'some_url',
    type: 'POST',
    data: {csrf_test_name: $.cookie('csrf_cookie_name')}
});

这段代码运行良好。

【讨论】:

    【解决方案3】:

    如果您使用 form_open("/some",'id="some_form"')form_close() ,CI 会创建一个隐藏输入来保留 csrf_token_name 及其值。

    所以,在您的 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>
    

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

    【讨论】:

      【解决方案4】:

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

      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.*

      this post找到解决方案

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题,但现在我已经解决了这个问题。

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

        $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 发送特定值时,我们将不得不像下面的代码一样发送 csrf 令牌

        $.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');
            }
        });
        

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

        【讨论】:

          【解决方案6】:

          只需按照以下代码:

          $.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){}
          });
          

          【讨论】:

          • 我认为这与其他答案相同,包括接受的答案。
          猜你喜欢
          • 2011-11-12
          • 1970-01-01
          • 1970-01-01
          • 2011-11-22
          • 1970-01-01
          • 2011-09-28
          • 2021-08-16
          • 1970-01-01
          • 2011-07-19
          相关资源
          最近更新 更多