即使Cookie传输,在Codeigniter Ajax请求中也禁止403 [英] 403 forbidden in Codeigniter Ajax request even with cookie transfer

查看:49
本文介绍了即使Cookie传输,在Codeigniter Ajax请求中也禁止403的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Ajax提交表单,我也在发送cookie,但是仍然收到403禁止。这是我尝试发送Cookie的2种方法。

I am submiting a form with Ajax, I am also sending the cookie, however I still get the 403 forbidden. These are the 2 ways I tried sending the cookie.

直接在Ajax中设置csrf cookie名称和值。

Directly setting csrf cookie name and value in Ajax.

function onSignIn(googleUser) {
    console.log('onto the function');
    var profile = googleUser.getBasicProfile();

    var google_name = profile.getName();
    var google_image = profile.getImageUrl();
    var google_email = profile.getEmail();
    console.log('got the details');
    console.log('submitting');
    var title = $('#title').val();
    var message = $('#message').val();
    console.log(google_name);
    var csrf_test_name = $("input[name=csrf_test_name]").val();
    console.log(csrf_test_name);
    console.log(title);
    console.log(message);
    $.ajax({
        type: "POST",
        url: 'http://localhost/hbp/review/submit',
        data: {
            title,
            message,
            '<?php echo $this->security->get_csrf_token_name(); ?>' : '<?php echo $this->security->get_csrf_hash(); ?>',
            'google_name': google_name,
            'google_email': google_email,
            'google_image': google_image,
        },
        success: function () {
            alert('fuck');
        }
    });

从表单字段获取CSRF cookie

Getting the CSRF cookie from the form field

                <form id="reviewForm" method="POST">
                    <div class="control-group">
                        <div class="controls">
                            <input type="text" class="form-control"
                                   placeholder="Title" id="title" required
                                   data-validation-required-message="Please enter the review title"/>
                            <p class="help-block"></p>
                        </div>
                    </div>
                    <div class="control-group">
                        <div class="controls">
    <textarea rows="10" cols="100" class="form-control"
              placeholder="Message" id="message" required
              data-validation-required-message="Please enter your message" minlength="5"
              data-validation-minlength-message="Min 5 characters"
              maxlength="999" style="resize:none"></textarea>
                        </div>
                    </div>
                    <div id="success"></div> <!-- For success/fail messages -->
                    <br>
                    <div class="g-signin2 btn btn-default pull-right" data-onsuccess="onSignIn"></div>
                    <br/>
                </form>

    function onSignIn(googleUser) {
    console.log('onto the function');
    var profile = googleUser.getBasicProfile();

    var google_name = profile.getName();
    var google_image = profile.getImageUrl();
    var google_email = profile.getEmail();
    console.log('got the details');
    console.log('submitting');
    var title = $('#title').val();
    var message = $('#message').val();
    console.log(google_name);
    var csrf_test_name = $("input[name=csrf_test_name]").val();
    console.log(csrf_test_name);
    console.log(title);
    console.log(message);
    $.ajax({
        type: "POST",
        url: 'http://localhost/hbp/review/submit',
        data: {
            title,
            message,
            'csrf_test_name ' : 'csrf_test_name ',
            'google_name': google_name,
            'google_email': google_email,
            'google_image': google_image,
        },
        success: function () {
            alert('fuck');
        }
    });

它们似乎都不起作用,如果有帮助,请使用此处的控制器。

None of them seem to work, here's the controller if it helps.

public function review($google_name, $google_email, $google_image, $message, $title)
{
    $this->load->library('session');
    $csrf_token = $this->security->get_csrf_hash();
    $data = array(
        'csrf_token' => $csrf_token
    );
    if (!$google_name and $google_email and $google_image and $message and $title) {
        $this->load->library('session');
        redirect('/', $this->session->set_flashdata('review_form_error', 'Error! All yields are required!')
        );
    } else {
        echo $google_name, $google_email, $google_image, $message, $title;
        $this->review_model->set_review($google_name, $google_email, $google_image, $message, $title);
        redirect(base_url(), $this->session->set_flashdata('review_success', 'Thank you for providing us with your helpful feedback'));
    }
}


推荐答案

如何解决CSRF令牌问题?


  • 在浏览器中打开开发者控制台

  • 转到网络选项卡

  • 单击正在发出的请求

  • 转到Cookies选项卡-比较请求和响应cookie

  • open developer console in browser
  • go to network tab
  • click on the request being made
  • go to Cookies tab - compare request and response cookies

您也可以在服务器端进行var_dump($ _ POST)。

You can also var_dump($_POST) on the server side.

特定问题的说明:

'csrf_test_name ' : 'csrf_test_name ',

这应该不是

'csrf_test_name ' : csrf_test_name,

尝试使用双引号:

'<?php echo $this->security->get_csrf_token_name(); ?>' : "<?php echo $this->security->get_csrf_hash(); ?>",

额外:如何以干净的方式将CI变量传递给JavaScript,避免PHP / JS混乱?

创建视图文件并将其包含在其中模板的底部:

EXTRA: how to pass CI variables to JavaScript in a clean way, avoiding PHP/JS clutter?
Create a view file and include it in the bottom of your template:

文件名= views / public / ci_config.php

file name = views/public/ci_config.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
?>
<script type="text/javascript">
  var CONFIG = {
    'base_url':                     '<?php echo base_url(); ?>',
    'csrf_expire':                  '<?php echo $this->config->item('csrf_expire'); ?>',
    'csrf_token_name':              "<?php echo $this->security->get_csrf_token_name(); ?>", // needs double quotes!
    'csrf_hash':                    "<?php echo $this->security->get_csrf_hash(); ?>" // needs double quotes!
  };
</script>

将其加载到父模板中,例如页脚部分,并带有:

Load it in a parent template, for example the footer partial, with:

<?php $this->load->view('public/ci_config'); ?>

在JS文件中的任何位置轻松访问此数据:

Easily access this data anywhere in JS files:

var csrf_token_name = CONFIG.csrf_token_name;
var csrf_hash = CONFIG.csrf_hash ;

或者像Aria所说:

$.ajaxSetup({
    data: {
        CONFIG.csrf_token_name : CONFIG.csrf_hash 
    }
});

现在,您不必将所有JS代码放入PHP文件中。

Now you don't have to put all your JS code in a PHP file.

这篇关于即使Cookie传输,在Codeigniter Ajax请求中也禁止403的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆