欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Codeigniter开启csrf protection时传送表单(or ajax)

在CI 2.0中有一个csrf(Cross Site Request Forgery) protection的功能


如果打开这个功能的话
post表单给server会吐error 500 
An Error Was Encountered 
The action you have requested is not allowed. 
会无法执行
这时候要在表单传送的数值中加入一个token的值
才能正常使用表单功能

可以在application/config/config.php中找到下面这几行

1
2
3
4
$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;

原本$config['csrf_protection']预设是FALSE改成TRUE就可以打开了
开启之后会自动帮你在cookie中存一个值
cookie的name在上面说的config.php中可以设定
之后传送表单就要连这个token一起传才行

以下用jquery的ajax功能示范

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$(function(){
    $('#btn').click(function(){
        $.ajax({
            type:'POST'
            ,url:'/ajax' //ajax接收的server端
            ,data:$('#form').serialize()+'&csrf_test_name='+ getCookie('csrf_test_name')
            ,success:function(data){
            alert(data.msg);
            }
            ,dataType:'json'
        });
    });
});
 
function getCookie(name){
    var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"));
    if(arr != null) return unescape(arr[2]); return null;
}

getCookie()是用js取出cookie的值
这是在网路上找到的可以直接拿去用

而csrf_test_name就是在config.php中可以设定的参数
将这个cookie抓出来一起送出表单
就可以正常使用了

有任何指教欢迎留言~

referer : http://ericlbarnes.com/blog/post/codeigniter_csrf_protection_with_ajax

================== 
update 
================== 
依据这页http://codeigniter.com/forums/ viewthread/163976/某楼提供的方法
可以使用以下方法取得token_name以及值

1
<input type="hidden" name="<?php echo $this->security->csrf_token_name?>" value="<?php echo $this->security->csrf_hash?>" />

满方便的
另外还有一点就是
如果是用CI内建的form helper 
在开启csrf_protection时会自动帮你加入这个token的值
我本身是没有在用啦
如果有在用的人就会比较方便啰(或许根本就不会发现这个问题XD) 
================== 
以上是update的资讯
==================

 

Posted by  on 2011年05月18日 in php , Codeigniter ,  ,  , 

Comments

来自  http://blog.hsin.tw/2011/codeigniter-csrf-protection-form-ajax/
普通分类: