403 запрещено в запросе Codeigniter Ajax даже при передаче cookie - PullRequest
0 голосов
/ 24 апреля 2019

Я отправляю форму с Ajax, я также отправляю cookie, однако я все еще получаю 403 запрещенных.Это 2 способа, которыми я пытался отправить куки.

Непосредственная установка имени и значения файла cookie csrf в 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');
        }
    });

Получение файла cookie CSRF из поля формы

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

Кажется, что ни один из них не работает, вот контроллер, если он помогает.

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

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Как устранить проблемы с токеном CSRF?

  • открыть консоль разработчика в браузере
  • перейти на вкладку сети
  • нажмите на выполняемый запрос
  • перейдите на вкладку Cookies - сравните файлы cookie запроса и ответа

Вы также можете использовать var_dump ($ _ POST) на стороне сервера.

Замечания по конкретному вопросу:

'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?
Создайте файл представления и включите его в нижней части шаблона:

имя файла = 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>

Загрузите его в родительский шаблон, например, в часть нижнего колонтитула:

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

Легкий доступ к этим данным в любом месте файлов JS:

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

Или, как Ария сказала:

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

Теперь вам не нужно помещать весь свой код JS в файл PHP.

0 голосов
/ 24 апреля 2019

попробуй ajax setup

$.ajaxSetup({
    data: {
        '<?php echo $this->security->get_csrf_token_name(); ?>' : '<?php echo $this->security->get_csrf_hash(); ?>'
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...