【问题标题】:CSRF and Ajax issue in CodeIgniter 3CodeIgniter 3 中的 CSRF 和 Ajax 问题
【发布时间】:2017-08-24 11:48:12
【问题描述】:

我在我的应用程序中使用 CodeIgniter3,其中一些表单使用 ajax。我已设置 csrf_regenerate = TRUE。最初我遇到了在连续的 ajax 调用(用于填充组合框)中传递 csrf 令牌的问题,我已经解决了。

我有一个更新 CSRFToken 的页面:

<script type="text/javascript" language="javascript">

var csfrData; 
csfrTokenName = '<?php echo $this->security->get_csrf_token_name(); ?>';
csfrHash = '<?php echo $this->security->get_csrf_hash(); ?>';

setCSRF(csfrTokenName, csfrHash);

function setCSRF(name, value) {
    csfrData = {}; // Reset csrfData to an empty array
    csfrData[name] = value;     
}
</script>

然后对于 ajax 调用,我执行以下操作:

$('#department_id').change(function() {

var department_id=$("#department_id").val();
var domain=$("#domain").val(); 

$.ajax({        
    'type': "POST",
            url: domain + "index.php/project/get_scheme",
            data: {department_id: department_id, csrf_test_name: csfrData.csrf_test_name},
            dataType: 'json',
            success: 
        function(j){

              setCSRF(j.csrfTokenName, j.csrfTokenHash);
              if(j.schemes.length >= 2) {
                var options = '';
                for (var i = 0; i <= (j.schemes.length-1); i++) {
                        options += '<option value="' + j.schemes[i].id + '">' + j.schemes[i].name + '</option>';
                }
                $("#scheme_id").html(options);
                $('#scheme_id option:first').prop('selected', 'selected');
              }                          
        }
      });

   });

这样所有的组合框都被填充了。但是当我最终提交表单时,出现以下错误:

您请求的操作不被允许。

当我使用 Burpsuite 检查时,我发现这次 csrf_token_name 和 csrf_cookie 的值不匹配,因此出现错误。我无法弄清楚为什么会这样。欢迎任何指导。

【问题讨论】:

  • Suneel 先生...在将我的问题标记为重复之前,您是否阅读过该帖子?我花了很长时间解决我要解决的问题
  • 嗨!您是否在 get_scheme 文件中使用会话或权限?
  • 测试带 www 和不带 www 的域
  • get_scheme 是控制器项目中的一个函数。它以 json 格式返回响应。 $response['schemes'] = $schemes; $response['csrfTokenName'] = $this->security->get_csrf_token_name(); $response['csrfTokenHash'] = $this->security->get_csrf_hash(); echo json_encode($response);

标签: php ajax codeigniter-3


【解决方案1】:

我已经解决了这个问题。我把它贴在这里是为了帮助人们在未来寻找答案。我没有意识到一个重要的点,虽然 csrf 令牌随着每个 ajax 请求而改变,但表单仍然有旧的令牌。所以在表单提交过程中,旧的token与服务器上的token不匹配。

在上次通话中,我从隐藏字段中删除了旧令牌并用最新的令牌替换它。然后表单就提交成功了。

$('input:hidden[name=csrf_test_name]').val('');
$('input:hidden[name=csrf_test_name]').val(j.csrfTokenHash);    

谢谢大家。

【讨论】:

    猜你喜欢
    • 2011-11-12
    • 2011-11-13
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 2011-07-19
    • 2011-09-28
    相关资源
    最近更新 更多