我正在开发一个CodeIgniter应用程序,在该应用程序中使用CSRF保护以及AJAX表单提交.我有$connect ð ' csref_regenerate ']= True;在我的配置中启用了该功能,但我在重复提交表格时遇到了403错误.
- I'm fetching a new CSRF token on every form submission using security->get_csrf_hash(); ?> in my JavaScript code.
- 我正在将令牌名称和哈希以及AJX请求中的表单数据一起发送.
- 我假设这些令牌正在服务器端通过$connect ð ' csref_regenerate ']= TRUE;在我的Deliver.php中重新生成.
Problem:
- 多次提交表格时,我仍然收到403错误.我怀疑预期的令牌和接收的令牌之间可能存在不匹配.
我正在寻找有关如何在我的场景中最好地处理CSRF保护和令牌再生的指导.
形式
<form id="add_category_form" method="post">
<h2>Add a Category</h2>
<ul>
<li>
<input type="text" name="category_name" required>
<label>Category Name</label>
</li>
<li>
<textarea name="description" required></textarea>
<label>Description</label>
</li>
<!-- FIXME: center the content of this last li tag -->
<!-- <li>
<label>Upload Images (5 Max)</label>
<input type="file" name="image" accept="image/*">
</li>
</ul> -->
<button type="button" data-dismiss="modal" aria-label="Close">Cancel</button>
<button type="submit">Save</button>
</form>
jQuery
<script>
$(document).ready(function() {
$("#add_category_form").on("submit", function(e) {
e.preventDefault();
let csrfTokenName = '<?= $this->security->get_csrf_token_name(); ?>';
let csrfHash = '<?= $this->security->get_csrf_hash(); ?>'; // Assuming you have these values in your view
let form_data = $(this).serialize() + "&" + csrfTokenName + "=" + csrfHash;
$.post("<?= base_url('CategoriesController/process_add_category'); ?>", form_data, function(response) {
console.log(response);
})
.fail(function(jqXHR, textStatus, errorThrown) {
console.error("AJAX Error:", textStatus, errorThrown);
});
return false;
});
});
</script>
控制器方法
public function process_add_category() {
$category_name = $this->input->post("category_name");
echo $category_name;
}