我根据情况在不同时间使用两种解决方案。
1. 方式有点乱,但推荐
获取控制器中的令牌名称和哈希值,并将其设置在页面上的某个位置作为数据字段(无论您选择何处)。例如
// get the data and pass it to your view
$token_name = $this->security->get_csrf_token_name();
$token_hash = $this->security->get_csrf_hash();
// in your view file, load it into a div for instance
<div id="my_div" data-token="<?php echo $token_name; ?>" data-hash="<?php echo $token_name; ?>"
现在,在您的 js ajax 代码中,您只需读取“my_div”中的数据值即可为您的 ajax 调用获取正确的数据。
如果你的页面上有一个真正的表单,那就更容易了,在这种情况下,不要使用一些div,只需不要在表单上使用form_open,而是自己创建隐藏的表单字段,这样你就可以通过js轻松读取它。
<input type="hidden" id="my_data" name="<?=$csrf['name'];?>" value="<?=$csrf['hash'];?>" />
这是重要的一点:当然,在发送发布数据后,您需要刷新令牌哈希值(在表单输入字段或 div 数据中,无论您选择这样做)。编写一个名为“refresh_csrf_data”的js函数,并使用“GET”来获取数据并更新字段。每当您完成 ajax post 时就可以调用此函数。
因此,每个 ajax 调用都会读取令牌数据,执行调用,然后刷新令牌数据,为下一次调用做好准备。
2. 简单但安全性较差
或者,您可以使用以下命令禁用 ajax 调用的 CSRF
$config['csrf_exclude_uris'] = array('controller/method');
在 CSRF 设置的配置文件中。
3. 更简单,但安全性也较差,我不使用它最后,您可以关闭每次提交时重新生成 CSRF 哈希
$config['csrf_regenerate'] = FALSE;
但是,请谨慎行事。这可能会让您面临某些类型的攻击。
最适合您的答案完全取决于页面的类型、使用情况、用户当时是否登录、是关键任务还是次要内容、是财务等。
没有什么是完全安全的,所以有时这是一种妥协。就我个人而言,我会在完全重新生成时使用 CSRF 来完成此操作,URI 中也不例外,并在需要时重新加载令牌和哈希数据。这看起来很复杂,而且需要解释,但是一旦您完成了一次,每当您需要时,就真的很容易一次又一次地执行,并且您的网站将比简单地避免其他选项的问题安全得多。