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

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

[复制链接]
发表于 2017-7-13 17:22:53 | 显示全部楼层
niushiluobo 发表于 2017-7-13 17:16
在程序员的角度来看是安全了,但是在用户的角度来看呢,就是有问题了,上传图片上传不去,用户有可能根本 ...

如果是这样认为,那如果是黑客攻击你怎么办呢?没有这样的限制不就会造成网站漏洞。当然,你如果觉得这个不合理,可以通过扩展上传类来实现你的功能,但是从框架角度,肯定是不能有任何漏洞的。网站漏洞原则上是 0 容忍的。
 楼主| 发表于 2017-7-13 17:24:51 | 显示全部楼层
Hex 发表于 2017-7-13 17:21
我觉得这不会造成漏洞啊,开发者不允许的文件还是无法上传上来呀。

开发者是都允许 jpg和png 的,但是jpg改成png后,依然是通不过  is_allowed_filetype  这方法,刚才说的900行附近那里:  in_array('image/jpeg', array('image/png',  'image/x-png'), TRUE)
发表于 2017-7-13 17:25:25 | 显示全部楼层
niushiluobo 发表于 2017-7-13 17:21
我知道是个mime值,我在写详细点
源码:

我明白你的意思,你是说如果用户不知道的情况下,一个错误的文件无法上传,但是这种情况你如何与黑客攻击区分开来?
 楼主| 发表于 2017-7-13 17:26:43 | 显示全部楼层
Hex 发表于 2017-7-13 17:22
如果是这样认为,那如果是黑客攻击你怎么办呢?没有这样的限制不就会造成网站漏洞。当然,你如果觉得这个 ...

这不关安全的事吧,类型是要判断的,我是觉得应该拿真实的文件类型去mime配置里面去比较而已
发表于 2017-7-13 17:28:12 | 显示全部楼层
niushiluobo 发表于 2017-7-13 17:24
开发者是都允许 jpg和png 的,但是jpg改成png后,依然是通不过  is_allowed_filetype  这方法,刚才说的9 ...

你这个问题可以通过增加 mimes.php 类型来解决,也就是说让 jpeg 和 png 有相同的 mime 就行了。但是,总体上,你如果扩展名和文件实际类型不相同,肯定是不能让你上传的。你可以思考下,如果我把一个 .php 文件或可执行文件伪装成 .png 怎么办?
发表于 2017-7-13 17:30:42 | 显示全部楼层
niushiluobo 发表于 2017-7-13 17:26
这不关安全的事吧,类型是要判断的,我是觉得应该拿真实的文件类型去mime配置里面去比较而已 ...

那这样不管你的扩展是 png 还是 jpg 不都可以上传了吗?如果我实际文件是 .php 然后伪装成 .png 怎么办呢?如果按照你的思路,那也可以上传成功了。
 楼主| 发表于 2017-7-13 17:31:23 | 显示全部楼层
Hex 发表于 2017-7-13 17:28
你这个问题可以通过增加 mimes.php 类型来解决,也就是说让 jpeg 和 png 有相同的 mime 就行了。但是,总 ...

所以我觉得判断类型拿文件的真实类型, 真实的是php文件,而程序员设置的类型只有图片类型,那是上传不了的
 楼主| 发表于 2017-7-13 17:33:43 | 显示全部楼层
Hex 发表于 2017-7-13 17:30
那这样不管你的扩展是 png 还是 jpg 不都可以上传了吗?如果我实际文件是 .php 然后伪装成 .png 怎么办呢 ...

源码再网上看一点:

$ext = strtolower(ltrim($this->file_ext, '.'));

                if ( ! in_array($ext, $this->allowed_types, TRUE))
                {
                        return FALSE;
                }

                // Images get some additional checks
                if (in_array($ext, array('gif', 'jpg', 'jpeg', 'jpe', 'png'), TRUE) && @getimagesize($this->file_temp) === FALSE)
                {
                        return FALSE;
                }

                if ($ignore_mime === TRUE)
                {
                        return TRUE;
                }

                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);
                }


我觉得呢,
$ext = strtolower(ltrim($this->file_ext, '.'));
应该拿真实的扩展
$ext = strtolower(ltrim($this->file_type, '.'));
发表于 2017-7-13 17:34:42 | 显示全部楼层
niushiluobo 发表于 2017-7-13 17:31
所以我觉得判断类型拿文件的真实类型, 真实的是php文件,而程序员设置的类型只有图片类型,那是上传不了 ...

那你设置的时候,需要设置 mime 而不能设置扩展名了。

你可以把你修改过的代码贴出来看下,然后看看是不是提交给官方。

不过,官方代码这块应该是没有漏洞的,否则发了这么多版,有上传漏洞早就被爆了。
发表于 2017-7-13 17:37:31 | 显示全部楼层
niushiluobo 发表于 2017-7-13 17:33
源码再网上看一点:

$ext = strtolower(ltrim($this->file_ext, '.'));

$ext = strtolower(ltrim($this->file_type, '.')); file_type 取出来是 mime 不是 .jpg 这种啊,$this->_mimes 的 key 是 .jpg 这种的。

本版积分规则