2017-08-24 98 views
0

我在我的应用程序中使用CodeIgniter3,一些表单使用ajax。我已经设置了csrf_regenerate = TRUE。最初我遇到了在连续的ajax调用中传递csrf标记(用于填充组合框)的问题,并且我解决了它。CodeIgniter中的CSRF和Ajax问题3

我有一个页面,我更新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的值不匹配,因此出现错误。我无法弄清楚为什么会发生这种情况。任何指导将受到欢迎。

+0

Suneel先生...您是否在将我的问题标记为重复之前阅读过该文章?我花了相当一段时间,我试图解决的问题 – John

+0

嗨!您是否在get_scheme文件中使用会话或权限? – Dario

+0

使用www测试域而不使用www – Dario

回答

0

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

在上次调用中,我已将旧标记从隐藏字段中删除,并将其替换为最新的标记。然后表单成功提交。

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

谢谢大家。