CodeIgniter 3中的CSRF和Ajax问题

时间:2017-08-24 11:48:13

标签: php ajax codeigniter-3

我在我的应用程序中使用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的值不匹配,因此错误。我无法弄清楚为什么会这样。欢迎任何指导。

1 个答案:

答案 0 :(得分:1)

我已经解决了这个问题。我在这里发布它,以便它可以帮助人们在将来寻找答案。我没有意识到一个重要的观点,即虽然每次ajax请求都会更改csrf令牌,但表单仍然有旧令牌。因此,在表单提交期间,旧令牌与服务器上的令牌不匹配。

在最后一次通话中,我从隐藏字段中删除了旧令牌,并将其替换为最新令牌。然后表格成功提交。

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

谢谢大家。