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


все, что вам нужно сделать, это перезагрузить токен SCRF в вашем ответе AJAX. Все так просто!


редактировать конфиг:

$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';