繁体   English   中英

CSRF令牌仅在使用Ajax首次提交时才有效

[英]Csrf token is valid just in first submit using ajax

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

    <!-- 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; 但是在这种情况下,有人可以使用以下应用程序在我的数据库中创建数百条记录:

http://i.imgur.com/qA4pqyr.png

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

如果您打算更改服务器端数据 ,则POST是正确的方法。

但是,如果您尝试仅从server读取数据 ,则应使用GET方法。

在这里很好地解释了


如果您希望禁用CSRF更新, 因为不必为每个请求生成新令牌,则可以在CI v3.0中通过设置配置来进行:

$config['csrf_regenerate'] = FALSE;

另一方面,如果您希望获取新令牌并刷新表单以进行新提交,请阅读此方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM