2015-07-17 14 views
1

Я пытаюсь выполнить вызовы Ajax в CodeIgniter. Как и раньше, когда защита CSRF активна, каждый запрос на сервер должен быть отправлен хэш (произвольно сгенерированный).Ошибка вызова Ajax на CodeIgniter - ошибка CSRF 403

В исследовании я нашел следующий код, чтобы всегда хэш для отправки вместе с другими данными через запрос Ajax:

$.ajaxSetup({ 
    data: { 
     arquivo_facil_tk: $.cookie('arquivo_facil_co') 
    } 
}); 

Так что я получил положительный результат на первый вызов сразу после загрузки страницы , Но, чтобы попробовать второй вызов, получите ошибку 403. Я также нашел возможность добавить этот фрагмент кода для каждого входящего вызова Ajax, но по мере того, как мое программное обеспечение выполняет несколько вызовов, оно становится неосуществимым и грубым.

Как я могу это исправить? Также попытался использовать событие beforeSend, но получил ту же ошибку.

ответ

1

Вместо использования ajaxSetup просто включить CSRF маркер вместе с data в Вашем вызове AJAX так:

data: {var: value, arquivo_facil_tk: $.cookie('arquivo_facil_co')} 

или если вы сериализации формы просто:

data: $(this).serialize() + '&arquivo_facil_tk=' + $.cookie('arquivo_facil_co') 
+0

ОК, это хорошо. Но я делаю несколько звонков в течение всего срока действия приложения и в нескольких разных функциях. У меня не было бы способа оставить эти данные стандартными для всех вызовов? – gilvandev

0

Проблема заключается в том, что токен csrf действителен только для одного вызова, поэтому, если вы хотите использовать ajax для другого запроса на отправку без обновления страницы, вам нужно каким-то образом получить новый токен без перезагрузки формы. Вы можете сделать это в своем контроллере codeigniter, отправив новый токен обратно на запрашивающий скрипт.

в контроллере CodeIgniter:

$data = array('data'=> 'data to send back to browser'); 
$csrf = $this->security->get_csrf_hash(); 
$this->output 
    ->set_content_type('application/json') 
    ->set_output(json_encode(array('data' => $data, 'csrf' => $csrf))); 

$ Данные = данные для возврата в браузер

$ CSRF = новый CSRF токен, который будет использоваться браузером для запроса поста следующего АЯКСА

Очевидно, вы можете выводить это другими способами, но JSON используется в основном с вызовами ajax. Кроме того, включать маркер таким образом, в каждом почтовом ответе, который будет использоваться для следующего после запроса

Затем в следующем запросе Ajax (JavaScript):

var token = data.csrf; 

$.ajax({ 
    url: '/next/ajax/request/url', 
    type: 'POST', 
    data: { new_data: 'new data to send via post', csrf_token:token }, 
    cache: false, 
    success: function(data, textStatus, jqXHR) { 
     // Get new csrf token for next ajax post 
     var new_csrf_token = data.csrf  
     //Do something with data returned from post request 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     // Handle errors here 
     console.log('ERRORS: ' + textStatus + ' - ' + errorThrown); 
    } 
}); 

Также помните, что там, где я получил csrf_token:token заменить crf_token с именем вашего токена, найденного в приложении/config/config.php в строке, которая заявляет $config['csrf_token_name'] = 'csrf_token';

0

У меня была та же проблема. Решение? Я использую один токен CSRF во всей системе, только меняя при входе/выходе (и аналогичных функциях).

Чтобы избежать нескольких отправлений из одной и той же формы (например, двойной щелчок или даже атака), когда я вызываю форму, я также вставляю случайный идентификатор в таблицу транзакций.

Когда я получу эту форму, я проверяю идентификатор в таблице транзакций. Если существует, выполните действие и удалите идентификатор из таблицы транзакций. Если это не так, сообщите об ошибке сообщения.

Смежные вопросы