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

У меня проблема, я все время получаю сообщение об ошибке, когда пытаюсь отправить сообщение с помощью 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 из javascript дает мне правильный токен или «хеш», но когда javascript отправляет запрос ajax, codeigniter возвращает ошибку, например,

Произошла ошибка. Запрошенное действие не разрешено.

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

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

Попробуйте (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++; }); } } }); } 

проверьте значение вашего $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')} }); 

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

Если вы используете form_open("/some",'id="some_form"') и form_close() , CI создайте скрытый ввод, который сохранит имя csrf_token_имя и его значение.

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

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

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

нашел решение из этой публикации