CodeIgniter开启csrf保护情况下,如何ajax提交成功后自动更新CSRF Token

代码脚本   1158阅读

使用CodeIgniter开发时的安全实践中提到通过配置$config['csrf_protection'] = TRUE来开启CodeIgniter的CSRF防护。但是在使用Ajax提交POST请求时,遇到提交成功一次后,在不刷新页面的情况下,不能再次提交成功。原因很明显,是CSRF Token没有更新导致不能跨域访问。

我采用的方法是在ajax提交成功时返回一个csrf-token

第一步,在控制器里面加一句代码如下:

$response['csrf_token'] = $this->security->get_csrf_hash();

这样在返回json中会增加一段csrf_token的值。

第二步,修改页面的javascript

<script>
   var get_csrf_hash;   
    get_csrf_hash = '<?=$this->security->get_csrf_hash()?>';
   function asubmit(){
    $('#submit').html("正在提交...");
    $('#submit').prop('disabled',true);
    var up_id=$("#up_id").val();
    var author_name = $("#author_name").val();
    var author_email = $("#author_email").val();   
    var author_url = $("#author_url").val();
    var message = $("#message").val();
    if(author_name===null||author_name===""||message===null||message===""){
        alert("评论要有内容哦");
        $('#submit').html("确认");
        $('#submit').prop('disabled',false);
    }else{    
    var datastring ='';
    datastring = {
        'author_name':author_name,
        'author_email':author_email,
        'author_url':author_url,
        'message':message,
        'up_id':up_id,
        'thread_key':'<?=$article_info['id']?>',
        'created_at':'<?=  time()?>',
        '<?php echo $this->security->get_csrf_token_name(); ?>':get_csrf_hash
    };
    $.ajax({
      type:"POST",
      url:"<?=$base_url?>index/comment_save",
      data:datastring,
      dataType:"json",
      success:function(sdata){
        //alert(sdata.errmsg);        
        $('#submit').html("确认");
        $('#submit').prop('disabled',false);
        if (sdata.data==="1") {        
          alert("评论成功");     
          get_csrf_hash = sdata.csrf_token;
        }
      }
    });  
}
    return false;       
   }
</script>

在提交方法asubmit()外定义一个全局的js变量get_csrf_hash,并且赋初值为<?=$this->security->get_csrf_hash()?>

在ajax提交返回成功之后,重新给get_csrf_hash赋值为sdata.csrf_token。

这样在每次提交ajax的post参数中都保持是最新的csrf token。


喜欢请常来,打赏请随意。

  1. 文栋说自媒体    回复

    良心分享,感谢您的分享,哈哈