Codeigniter CSRF действителен только для одного запроса ajax
Я хочу загрузить изображение на сервер при изменении события jQuery, но с помощью codeigniter csrf я могу загрузить изображение только один раз. Как загрузить изображения с помощью ajax для нескольких запросов.Пожалуйста, имейте в виду, когда я устанавливаю это
config['csrf_protection'] = FALSE;
тогда я могу отправить несколько запросов jQuery onChange event, но когда csrf_protection будет ложным, Я думаю, что нет никакого преимущества csrf. поэтому вопрос в том, как я могу отправить несколько запросов с помощью ajax, пока csrf_protection включить. Мой код jquery следующий
$("#avatar").change(function(){
var link = $("#avatar").val();
$.ajax({
url : "<?php echo base_url('main/test'); ?>",
type: 'post',
data: {'<?php echo $this->security->get_csrf_token_name(); ?>':'<?php echo $this->security->get_csrf_hash(); ?>',"id":"hello","link":link},
success : function(data)
{
alert(data);
}
});
});
5 ответов
на мой взгляд, вы должны попытаться воссоздать свой токен csrf каждый запрос
попробуйте этот пример кода...
для функции js
var csrfName = '<?php echo $this->security->get_csrf_token_name(); ?>',
csrfHash = '<?php echo $this->security->get_csrf_hash(); ?>';
("#avatar").change(function(){
var link = $("#avatar").val();
$.ajax({
url : "<?php echo base_url('main/test'); ?>",
type: 'post',
data: {csrfName:csrfHash,"id":"hello","link":link},
success : function(data)
{
csrfName = data.csrfName;
csrfHash = data.csrfHash;
alert(data.message);
}
});
});
и контролером
public function test() {
$config['upload_path'] = './uploads/';
$config['allowed_types'] = 'gif|jpg|png';
$config['max_size'] = 500;
$config['max_width'] = 260;
$config['max_height'] = 260;
$reponse = array(
'csrfName' => $this->security->get_csrf_token_name(),
'csrfHash' => $this->security->get_csrf_hash()
)
$this->load->library('upload', $config);
if (!$this->upload->do_upload('link')) {
$reponse['message'] = "error";
}
else {
$data = array('upload_data' => $this->upload->data());
$image_name = $data['upload_data']['file_name'];
$reponse['message'] = $image_name;
}
echo json_encode($reponse);
}
Дайте мне знать, и удачи
Примечание: когда кто-то попросит вас опубликовать больше данных на вопрос, не публикуйте его в качестве комментария или ответа, лучше отредактировать сам вопрос и добавить материал
вы можете установить это в config.в PHP
$config['csrf_regenerate'] = FALSE;
таким образом, защита csrf действительна в течение всего времени сеанса, это решит вашу проблему.
Если вы установите
$config['csrf_regenerate'] = true;
затем CI генерирует новый токен csrf каждый запрос, чтобы ваш старый токен csrf не совпадал с новым сгенерированным токеном csrf
редактировать конфиг:
$config['csrf_exclude_uris'] = ['controller/method'];
массив может включать все белые контроллеры/методы, для которых вы хотите отключить защиту csrf.
массив также может обрабатывать регулярные выражения, такие как:
$config['csrf_exclude_uris'] = array(
'api/record/[0-9]+',
'api/title/[a-z]+'
);
для получения дополнительной информации посетите Документация Codeigniter-Класс Безопасности
добавьте это в файл js, который загружается на каждую страницу (я помещаю это в конец jquery.в JS )
$.ajaxSetup({
beforeSend:function(jqXHR, Obj){
var value = "; " + document.cookie;
var parts = value.split("; csrf_cookie_name=");
if(parts.length == 2)
Obj.data += '&csrf_token='+parts.pop().split(";").shift();
}
});
(обратите внимание, что в каждом запросе ajax вы не можете отправлять пустые данные)
" csrf_cookie_name " вверху определено в конфигурации.в PHP
$config['csrf_cookie_name'] = 'csrf_cookie_name';