用户
 找回密码
 入住 CI 中国社区
搜索
查看: 15972|回复: 11
收起左侧

[AJAX] 开启csrf ,ajax的时候,提示The action you have requested is not allowe

[复制链接]
发表于 2012-9-23 20:35:43 | 显示全部楼层 |阅读模式
本帖最后由 zsj1029 于 2012-9-23 21:19 编辑

ajax  的时候提示 The action you have requested is not allowed
开启了csrf 跨站请求伪造 防范的缘故  具体名词解释http://baike.baidu.com/view/1609487.htm
config 中的
$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;
ajax的时候就不会在报错了 ,或者ajax不重要的post请求改为get估计也行

但是有人说了 我就是想开启最高安全防范跨站请求伪造怎么办
看了文档的孩子都知道http://codeigniter.org.cn/user_guide/libraries/security.html最下面
调用ci的form_open的时候,看源文件能找到紧跟form标签后面有个隐藏域,里面就放着随机生成的代码,当开启保护的时候,提交表单会比对这段代码,从而防范攻击

解决方法
jquery为例
参数name:值


JS复制代码
<?php echo $this->security->get_csrf_token_name();?>  : '<?php echo $this->security->get_csrf_hash(); ?>
复制代码


传递参数同时把csrf的code传过去


发表于 2016-5-30 15:47:51 | 显示全部楼层
如果在一个页面中需要多次使用AJAX呐?第一次能获取到正确的token,再次使用AJAX时就会报错:The action you have requested is not allowed.
发表于 2012-10-11 16:53:15 | 显示全部楼层
我也遇到这个问题,楼主可以说详细点吗
发表于 2012-10-12 10:44:49 | 显示全部楼层
本帖最后由 nistlrooy 于 2012-10-12 10:46 编辑

经过论坛理搜索我发现可以通过csrf的方法
就是在ajax传输data的时候附上验证信息

JS复制代码
$.ajax({
                          type:'post',
                           url:'http://'+location.hostname+'/edit',
                           //post data 最后面用于csrf验证
                           data:{title:title.val(),'<?php echo $this->security->get_csrf_token_name(); ?>':'<?php echo $this->security->get_csrf_hash(); ?>'},
                            dataType:'json',
                             success:function(data)
                            {
                                  alert(data.title);
                            }
                )};
复制代码


发表于 2013-2-11 10:17:07 | 显示全部楼层
有问题吧,<?php echo ...?> 在js代码中能显示吗?
发表于 2013-2-15 16:09:44 | 显示全部楼层
CI的csrf有个问题,那个csrf随机key不会变的,是故意设计成这样的?
发表于 2013-2-16 09:51:24 | 显示全部楼层
kaneiii 发表于 2013-2-15 16:09
CI的csrf有个问题,那个csrf随机key不会变的,是故意设计成这样的?

重新load就变了
发表于 2013-2-16 11:29:17 | 显示全部楼层
gauspican 发表于 2013-2-11 10:17
有问题吧, 在js代码中能显示吗?

把php代码写在有html的js代码里。太绕了  
发表于 2013-2-16 13:52:33 | 显示全部楼层
sdink 发表于 2013-2-16 11:29
把php代码写在有html的js代码里。太绕了

就是写在view里,呵呵
发表于 2013-2-17 08:31:24 | 显示全部楼层
gauspican 发表于 2013-2-16 13:52
就是写在view里,呵呵

   
发表于 2013-2-20 09:39:03 | 显示全部楼层
gauspican 发表于 2013-2-16 09:51
重新load就变了

重新load也不会变的。
构造器里
                // Set the CSRF hash
                $this->_csrf_set_hash();
初始化自己的成员变量$_csrf_hash,cokkie里有key的话就从cokkie取,否则就MD5新建一个key。

csrf_verify()里
                // Nothing should last forever
                unset($_COOKIE[$this->_csrf_cookie_name]);
                $this->_csrf_set_hash();
                $this->csrf_set_cookie();
看注释也是要重新变更csrf key,但是由于成员变量$_csrf_hash没有清空,所以重设的csrf key还是成员变量$_csrf_hash(参看_csrf_set_hash()),根本不会变。

不解。

本版积分规则