【问题标题】:CSRF and ajax form submit in codeigniter 3 using knockout js click binding - Forbidden errorCSRF和ajax表单在codeigniter 3中使用淘汰js点击绑定提交 - 禁止错误
【发布时间】:2016-03-30 20:27:29
【问题描述】:

我正在尝试通过 ajax post 方法通过敲除 js 单击绑定单击按钮来提交用户表单。我收到的错误是 403 - 禁止。

我确定它与 CSRF 有关,但无法弄清楚。

查看.php:

<?php echo form_open('client/search_client_database', ['role' => 'form']); ?>
  <fieldset>
    <div class="form-group">
      <label class="sr-only" for="search_client_input">Search for existing   clients</label>
      <div class="input-group">
      <input class="form-control input-sm" type="text" id="search_client_input" name="search_client_input" placeholder="Search for existing clients...">
      <span class="input-group-btn">
          <button class="btn btn-primary btn-sm" type="button" data-bind="click: search_client">Search</button>
      </span>
    </div>
   </div>
  </fieldset>
<?php echo form_close(); ?>

点击按钮时,会触发淘汰 Js 点击绑定以启动对控制器的 ajax 调用。 Knockout js 代码位于一个单独的 js 文件中,该文件与视图一起加载。

Client.js 文件:

var base_url = window.location.origin;
var url = base_url+"/client/";

this.search_client = function()
        {           
            crsf = $("input[name=csrf_test_name]").val();
            dataString = $("#search_client_input").val();
            alert(crsf);
            $.ajax({
                url: url+"search_client_database",
                type: "post",
                cache: false,
                data: {crsf: crsf, data: dataString},
                success: function(customer_details) {
                    alert(customer_details);                    
                },
                error: function(xhr, ajaxOptions, thrownError)
                {
                    alert(xhr.status);
                    alert(thrownError);
                }
            });
        }

控制器:

public function search_client_database()
    {
        $data = $this->input->post('data');
        echo $data;
    }

我不断收到 xhr 错误 403,即禁止。网址没有错。

【问题讨论】:

  • 您必须发回与$config['csrf_token_name'] 中配置的名称相同的 csrf 令牌。所以试试data: {"csrf_test_name": crsf, data: dataString},

标签: jquery ajax codeigniter knockout.js


【解决方案1】:

您必须发回与$config['csrf_token_name'] 中配置的名称相同的 csrf 令牌。

根据您的代码,它被称为 csrf_test_name,因此您需要在 Ajax 请求的 data 中使用它:

$.ajax({
  url: url + "search_client_database",
  type: "post",
  cache: false,
  data: {
    "csrf_token_name": crsf,
    data: dataString
  },
  success: function(customer_details) {
    alert(customer_details);
  },
  error: function(xhr, ajaxOptions, thrownError) {
    alert(xhr.status);
    alert(thrownError);
  }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-18
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 2013-08-14
    相关资源
    最近更新 更多