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

[安全] 关于flash上传csrf保护的一个解决办法

[复制链接]
发表于 2012-9-17 23:05:06 | 显示全部楼层 |阅读模式
本帖最后由 haoshaoyee 于 2012-9-17 23:06 编辑

查了众多资料 理解为
php把浏览器当作一客户端,把flash当作是另一客户端 CI会为其也创建一个随机保护值
那么我们在浏览器客户端赋给flash的保护值就与CI为其创建的保护值不相等,于是拒绝所有post

不会改ci的底层 于是就用了个简单的办法 判断是否为flash上传 是则不保护 不是则保护.
但这样改不知会对flash上传的安全性有多大影响.

改 core/Input.php 646行
if ($this->_enable_csrf == TRUE)

if ($this->_enable_csrf == TRUE && !$this->post('close_csrf'))

flash上传时附加一个名为close_csrf 的post参数
发表于 2012-12-7 01:25:47 | 显示全部楼层
哈哈! 感谢,刚刚搜到这篇文章我的问题也解决了 ! 谢谢
发表于 2012-12-13 10:16:42 | 显示全部楼层
另一种办法是废除ci的csrf,自己在扩展控制器(MY_controller)的构造函数或者_remap函数里自己构建,主要参考csrf过程,里面有自定义的加密函数和输出函数,控制器属性data会在输出视图时被输出。
PHP复制代码
 
public function _remap($method = NULL, $params = array())
        {
                $go = TRUE;
 
                //自建跨站请求防御以取代CI的并不方便也不十分安全的跨站请求防御
                if(empty($_COOKIE['token']))
                {
                        $uniqid = uniqid();
                        setcookie('token',$uniqid);
                }
                else
                {
                        $uniqid = $_COOKIE['token'];
                }
 
                if(!empty($_POST))
                {
                        $token = $this->input->get_post('token');
                        if($token === saltedhash($_COOKIE['token'],$token))
                        {
                                $go = TRUE;
                                if(!is_ajax())
                                {
                                        //$uniqid = uniqid();
                                        setcookie('token',uniqid());
                                }
                        }
                        else
                        {
                                $go = FALSE;
                                show_error('Your request is not allowed.');
                        }
                }
                $this->data['token'] = saltedhash($uniqid);
 
                if($go)
                {
                        if (!empty($method) && method_exists($this, $method)) call_user_func_array(array($this, $method), $params);
                       
                        $this->__output();
                }
        }
 
复制代码
发表于 2012-12-13 10:20:28 | 显示全部楼层
靠,回复不能收藏,我新开贴去

本版积分规则