我想使用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;
,但在这种情况下,有人可以用这样的应用程序在我的数据库中创建数百条记录:
每个CSRF令牌只能提交一个POST是正确的,因为它们是一次性使用的。
如果您的意图是修改服务器端数据, POST是正确的方法。
但是如果你只是试图从服务器读取数据,你应该使用GET方法。
这里解释得很好。
如果您想禁用CSRF续订,因为不需要为每个请求生成新的令牌,您可以在CI v3.0中通过设置以下配置来实现:
$config['csrf_regenerate'] = FALSE;
另一方面,如果您希望获得一个新的令牌并刷新表单以进行新的提交,请阅读本文