使用codeigniter 403的 AJAX 请求(禁止)

dsf9zpds  于 2022-12-07  发布在  其他
关注(0)|答案(6)|浏览(220)

我试图用 AJAX 发送一个值到Codeigniter的控制器文件,但是没有成功。我已经搜索了这个问题,我现在这个问题在这里做了很多次,但是仍然没有找到解决方案。希望有人能帮助我。谢谢!
Js文件。

function submitSend()
{
    var message = $('#sms').val();
    if(message == "")
    {
      $("#sms").attr("placeholder", "Type a message please...");
      return false;
    }

    $.ajax(
    {
      url: "<?php echo base_url();?>/mychat/send",
      type: 'POST',
      data:{
              '<?php echo $this->security->get_csrf_token_name(); ?>' : '<?php echo $this->security->get_csrf_hash(); ?>',
              'message': message
             },
      success: function (data)
      {
       window.console.log('Successful');
      },
      error :function(data)
      {
      window.console.log('Failed');
      }
    });
}

控制器函数。它在名为MyChat的文件中。

public function send()
  {
     $message = $this->input->post('message');
     echo $message;
  }
rmbxnbpk

rmbxnbpk1#

在包含JS文件之前,将此代码添加到页脚视图中

<?php $CI =& get_instance(); ?>
<script> 
    var csrf_name = '<?php echo $CI->security->get_csrf_token_name(); ?>';
    var csrf_hash = '<?php echo $CI->security->get_csrf_hash(); ?>';
</script>

在任何需要的地方调用这些变量

data:{
     csrf_name : csrf_hash,
     'message': message
},
vtwuwzda

vtwuwzda2#

恐怕你不能在JavaScript文件中使用PHP标记,因为你已经提到你有一个JS文件。
必须在**.php文件中运行PHP代码。
也许你可以把submitSend()函数分离一下,通过提取PHP标签和$('#sms').val()使它更模块化。这些标签可以作为参数传递给函数,从你调用它的地方
.php文件)**。

jtoj6r0c

jtoj6r0c3#

很可能是因为CSRF令牌,请尝试禁用csrf并检查是否是由于csrf,然后将csrf配置中的特定功能列入白名单

rekjcdws

rekjcdws4#

这对我有用。

/应用程序/配置/安全性.php

/**
     * --------------------------------------------------------------------------
     * CSRF Token Name
     * --------------------------------------------------------------------------
     *
     * Token name for Cross Site Request Forgery protection cookie.
     *
     * @var string
     */
    public $tokenName = 'csrf_token_name';

在我的表单中

<input type="hidden" name="<?= csrf_token() ?>" value="<?= csrf_hash() ?>" />

在脚本.js中

var tokenHash=jQuery("input[name=csrf_token_name]").val();
$.ajax({
  method: "POST",
  url: "/somecontroller",
  data: { name: "John", location: "Boston" },
beforeSend: function (xhr) 
        {       
        xhr.setRequestHeader('X-CSRF-Token' , tokenHash);       
        },
})
  .done(function( msg ) {
    console.log( "Data Saved: " + msg );
  });
cfh9epnr

cfh9epnr5#

用于代码点火器4
首先,转到app/Config/Security.php
变更

public $regenerate = true;

结束日期

public $regenerate = false;

注意:将$regenerate变更为false并不是良好的作法。
第二步,转到app/Config/Routes.php创建您路由器,您将调用该路由器来执行请求。

$routes->post('url', 'ControllerName::FunctionName');

然后确保u将csrf_token()csrf_hash()添加到要发送的数据中。
所以代码看起来像这样:

var data= {
    "<?= csrf_token() ?>" : "<?= csrf_hash() ?>",// make sure this line exists
    something: "Something"
};

$.ajax({
        url: "<?= base_url('url_in_routes') ?>",
        type: "POST",
        data: data,
        headers: {'X-Requested-With': 'XMLHttpRequest'},
            
        success: function (response){
            console.log("success");
                
        },
        error: function(xhr, status, error) {
            console.log("Error: " + error);
              
        },
        complete: function(data) {
            console.log(data.statusText);
        }
});

控制器:

class Test extends BaseController{
    
    public function handleAjaxRequest(){
        $something = $this->request->getPost('something');
        // Now u can use $something to save it to ur DB or do what you want.
    }
    
}

Codeigniter中的另一件事是,当请求未能通过CSRF验证检查时,默认情况下它将重定向到上一页,这样用户就看不到错误。要关闭它,请转到app/Config/Security.php
变更

public $redirect = true;

public $redirect = false;
sf6xfgos

sf6xfgos6#

你不能在js文件中使用php标签

url: "<?php echo base_url();?>/mychat/send", //this line in js file is wrong

在.php文件中,只能在脚本标记中使用php标记,如下所示

<script>
 // ... some code here 
     url: "<?php echo base_url();?>/mychat/send",
 // ... some code here
</script>

或在页眉html中添加此行

<script> 
    var BASE_URL = '<?php echo base_url(); ?>';
</script>

并在js文件中使用它

....
url: BASE_URL+"mychat/send",
....

相关问题