2017-01-13 12 views
1

В начале я отключил свой CSRF только для простоты, чтобы сделать мою форму/ajax работу. Теперь, когда я включил его и попытался использовать входы и прочее для CSRF, ничего не получится. Моя форма не отправляется или когда она обновляет всю мою страницу, что я не могу допустить, чтобы это произошло. Вот мой текущий код.CSRF Protections with AJAX & FORM - CodeIgniter - Not Sending

form method="post"> 
    <input type="text" name="vip_text_box" id="vip" value="<?php echo $total_amount ?>"> <br><br> 
    <input type="submit" id="submit" value="Redeem" onclick="return rebate_amount()"> 
    <input type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash(); ?>"> 
</form> 

И AJAX:

function rebate_amount(){ 

    var value = document.getElementById('vip').value; 
    var datastring = 'vip='+value; 
    var url = base_url + '/index.php/home/redeeming_form_value'; 

    $.ajax({ 
    type : 'post', 
    url : url, 
    data: datastring, 
    cache: false, 
    success: function(html){ 

     $('#vip_point_redeeming').html(html); 

    } 
    }); 
    return false; 
} 

Имейте в виду. Это все работает, когда CSRF отключен в файле конфигурации. Но я думаю, что здесь проблема с CSRF с формой/ajax.

+0

Ваш запрос AJAX создает операцию POST, но не в состоянии обеспечить маркер CSRF. Когда CodeIgniter получает операцию POST, он не может найти TOKEN и отключает все, прежде чем вы сможете запустить любой код. –

ответ

2

Вы должны также включать в себя csrf_token с данными

500 Внутренняя ошибка сервера

Ваш запрос AJAX создает операцию POST, но не в состоянии обеспечить CSRF токен . Когда CodeIgniter получает операцию POST, он не найти ЛЕКСЕМУ и закрывает все вниз, прежде чем у вас есть шанс запуска любого кода, таким образом, вы получаете 500 внутренняя ошибка сервера

Либо вы делаете

data : $("#your_form").serialize(); 

ИЛИ

data: { 
     '<?php echo $this->security->get_csrf_token_name(); ?>':'<?php echo $this->security->get_csrf_hash(); ?>', 

      /*....your data....*/ 
      vip:document.getElementById('vip').value 
     }, 

Ваша функция будет выглядеть несколько

function rebate_amount(){ 

var url = base_url + '/index.php/home/redeeming_form_value'; 

$.ajax({ 
    type : 'post', 
    url : url, 
    data: { 
    '<?php echo $this->security->get_csrf_token_name(); ?>':'<?php echo $this->security->get_csrf_hash(); ?>', 

     /*....your data....*/ 
     vip:document.getElementById('vip').value 
    }, 
    cache: false, 
    success: function(html){ 
     $('#vip_point_redeeming').html(html); 
    } 
    }); 
    return false; 
} 
+0

Это выглядит довольно хорошо. Не знаете, где код AJAX определяется, но вам нужно, чтобы CodeIgniter подавал токен CSRF, чтобы вы могли передать его с данными POST. –

+0

Я предполагаю, что код ajax определен в представлении, поэтому, когда пользователь загружает представление '$ this-> load-> view (..)', данные могут быть заполнены маркером и значением, если он еще не может сериализовать –

+0

. Разумное предположение , Я его не тестировал. Я просто пытался предоставить разъясняющий текст для OP, поскольку ваш пост довольно краток. –