У меня проблема, я все время получаю сообщение об ошибке, когда пытаюсь отправить сообщение с помощью 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. *
нашел решение из этой публикации