Csrf令牌仅在使用ajax的第一次提交时有效


Csrf token is valid just in first submit using ajax

我想使用jquery ajax提交我的表单,这是ok的,但只是第一次我点击提交,这是我的代码。

    <!-- input code from the form -->
    <input type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash(); ?>" />
    <!-- js code -->
    $.ajax({
        url: ajaxurls.ask,
        type: 'POST',
        data: formData,
        contentType: false,       // The content type used when sending data to the server.
        cache: false,             // To unable request pages to be cached
        processData:false, 
        success: function (html) {
            var data = jQuery.parseJSON(html);
            if(data.status == 'ok') {
                $('.row_question_form').after(data.response.html);
                $('.question_' + data.response.question[0].question_id).hide().fadeIn();
                $('#question_form').val('');
                $('#thumbnails').empty();
                $('#ask_question_messages').empty();
                $('#ask_question_messages').html(data.message);
            }else if(data.status == 'error'){
                $('#ask_question_messages').empty();
                $('#ask_question_messages').html(data.message);
            }
        }
  });

你可能会说设置$config['csrf_regenerate'] = FALSE;,但在这种情况下,有人可以用这样的应用程序在我的数据库中创建数百条记录:

https://i.stack.imgur.com/Ziu8h.png

每个CSRF令牌只能提交一个POST是正确的,因为它们是一次性使用的。

如果您的意图是修改服务器端数据, POST是正确的方法。

但是如果你只是试图从服务器读取数据,你应该使用GET方法。

这里解释得很好。


如果您想禁用CSRF续订,因为不需要为每个请求生成新的令牌,您可以在CI v3.0中通过设置以下配置来实现:

$config['csrf_regenerate'] = FALSE;

另一方面,如果您希望获得一个新的令牌并刷新表单以进行新的提交,请阅读本文