用户
 找回密码
 入住 CI 中国社区
搜索
楼主: niushiluobo
收起左侧

[上传/下载] 上传类 判断文件允许类型 有bug?

[复制链接]
 楼主| 发表于 2017-7-13 17:01:54 | 显示全部楼层
Hex 发表于 2017-7-13 16:47
看了一下,确实感觉不一致,你可以尝试提交 BUG 到官方 github 上。

刚看了下3.15的源码,也是没改到这部分
 楼主| 发表于 2017-7-13 17:06:56 | 显示全部楼层
Hex 发表于 2017-7-13 16:56
你为什么认为这里应该都用 file_type ?

900行左右

源码:

if (isset($this->_mimes[$ext]))
                {
                        return is_array($this->_mimes[$ext])
                                ? in_array($this->file_type, $this->_mimes[$ext], TRUE)
                                : ($this->_mimes[$ext] === $this->file_type);
                }

按我上面的举例把一个jpg的文件改成png后缀,这里的判断就是
if (isset($this->_mimes['png']))
                {
                        return is_array($this->_mimes['png'])
                                ? in_array('image/jpeg', $this->_mimes['png'], TRUE)
                                : ($this->_mimes['png'] === 'image/jpeg');
                }

这样看你不觉得有问题了吗
发表于 2017-7-13 17:11:24 | 显示全部楼层
niushiluobo 发表于 2017-7-13 17:01
file_ext  是扩展名,可以任由人改的,从jpg改成png,改成mp4,改成csv,都是可以的,而file_type又是读真 ...

这里没有直接比较吧,是通过 $ext 获取 $mimes 里的 file_type 值,然后和 $this->file_type 做比较呀
发表于 2017-7-13 17:12:38 | 显示全部楼层

你指的问题是说这里有漏洞?
发表于 2017-7-13 17:13:41 | 显示全部楼层

$this->_mimes['png'] === 'image/jpeg'  这样的话,你改了文件扩展名,不就是不相等了么,会阻止你上传,这样就安全了呀。
 楼主| 发表于 2017-7-13 17:16:10 | 显示全部楼层
Hex 发表于 2017-7-13 17:13
$this->_mimes['png'] === 'image/jpeg'  这样的话,你改了文件扩展名,不就是不相等了么,会阻止你上传 ...

在程序员的角度来看是安全了,但是在用户的角度来看呢,就是有问题了,上传图片上传不去,用户有可能根本不知道这个文件被改过名字的,也是是网上下载之前被人改过的,这样就有问题了
发表于 2017-7-13 17:17:02 | 显示全部楼层
$this->_mimes 里的内容你可以看下 config/mimes.php 里,里面存储的是扩展名和 file type 的关系,所以这里是通过扩展名找到 mime 然后在 mime 之间比较,也就是说 $this->file_type 是个 mime 值。
 楼主| 发表于 2017-7-13 17:17:19 | 显示全部楼层
Hex 发表于 2017-7-13 17:11
这里没有直接比较吧,是通过 $ext 获取 $mimes 里的 file_type 值,然后和 $this->file_type 做比较呀 ...

对,去_mimes里面的png类型和  真实的 jpeg类型做比较,这里就是漏洞,或者像你说的保护措施
发表于 2017-7-13 17:21:14 | 显示全部楼层
niushiluobo 发表于 2017-7-13 17:17
对,去_mimes里面的png类型和  真实的 jpeg类型做比较,这里就是漏洞,或者像你说的保护措施 ...

我觉得这不会造成漏洞啊,开发者不允许的文件还是无法上传上来呀。
 楼主| 发表于 2017-7-13 17:21:56 | 显示全部楼层
Hex 发表于 2017-7-13 17:17
$this->_mimes 里的内容你可以看下 config/mimes.php 里,里面存储的是扩展名和 file type 的关系,所以这 ...

我知道是个mime值,我在写详细点
源码:

if (isset($this->_mimes[$ext]))
                {
                        return is_array($this->_mimes[$ext])
                                ? in_array($this->file_type, $this->_mimes[$ext], TRUE)
                                : ($this->_mimes[$ext] === $this->file_type);
                }

解析后:
     in_array('image/jpeg', array('image/png',  'image/x-png'), TRUE)

比较的是这个, 对吧?

本版积分规则