欢迎各位兄弟 发布技术文章
这里的技术是共享的
如果打开这个功能的话
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的资讯
==================
Comments
刚刚遇到这个问题. 看了你这个解决了. 谢谢啦台湾同胞!
别客气~
同胞我按你的做法弄了
Request Method:POST
Status Code:500 Internal Server Error
post过来的值也有csrf_tk_name。
username:abcabc
password:e10adc3949ba59abbe56e057f20f883e
seccode:aaa
csrf_tk_name:1cdf120ee9a9fe57d43919e6cd54fb22
commit:Login
但是仍然是
The action you have requested is not allowed.
是什么原因。PS:我已经帮你点了一下右边的广告
由于站里的框架比较多开错了config 汗。同胞有空给我Email互换个链接啥的。3Q
ok的啦~
我没有互换过连结耶
不知道那是干嘛用的?
我的email是joe [at] aol.tw
有机会再交流交流吧~
刚刚看了一下最新版的CI_Security Class
csrf_token_name跟csrf_hash好像变成protected了
所以如果用php要用$this->security->get_csrf_token_name()跟$this->security->get_csrf_hash()来抓值
了解~谢谢啦~
感恩啊!
有点久的问题,可以问一下吗?
我在codeigniter 最新版3.0.0 开启CSRF功能,有使用form helper,但POST表单至另一支程式,却怎么都接不到token值,但其他自订的input 用$this->input->post ('something');
而token 的input 也是自己产生的,比如:
可否问一下,谢谢你。
所以流程是有正常进到controller里面吧?
那应该就可以不用管token值了
他好像会自己处理csrf的问题
你可以另外测试看看
手动建立表单然后不要放csrf的token
表单送出后会报错误(好像是吐error 500)
====订正一下=====
其他自订的input用$this->input->post('something');就可以接到。
'<input type="hidden" name="csrf_test_name" value="c045c5830badeee443b350053e76cbb1" /'
[…] http://blog.hsin.tw/2011/codeigniter-csrf-protection-form-ajax/ […]