Codeigniter (CSRF) jQuery Ajax проблема - PullRequest
       3

Codeigniter (CSRF) jQuery Ajax проблема

9 голосов
/ 08 сентября 2011

У меня проблема здесь, я продолжаю получать сообщение об ошибке, когда пытаюсь опубликовать что-то с помощью 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++;
                });
            }
        }
    });
}

мой CCT var fromjavascript дает мне правильный токен или «хеш», но когда javascript отправляет запрос ajax, codeigniter возвращает ошибку, например,

Обнаружена ошибка Запрошенное вами действие не разрешено.

Как это исправить? Нужно ли мне проверять токен CSRF или что-то в моем контроллере?

Я использую Codeigniter 2.0.3

Ответы [ 5 ]

11 голосов
/ 08 сентября 2011

Попробуйте (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++;
                });
            }
        }
    });
}
2 голосов
/ 16 марта 2013

проверьте значение вашего $config['csrf_token_name'] в /application/config/config.php, поскольку по умолчанию установлено значение csrf_test_name , а не csrf_token_name .

Это решение, если вы не хотите использовать PHP-код в Javascript.

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

Этот код отлично работает.

1 голос
/ 04 ноября 2014

Если вы используете 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 всегда была моей проблемой, и этим методом она была решена !!

0 голосов
/ 20 марта 2018

Просто следуйте этому коду:

$.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){}
});
0 голосов
/ 21 декабря 2014

может быть поздно, но я нашел это идеальное решение, вроде хака, но должно работать

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

найдено решение от этот пост

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...