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

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

[复制链接]
 楼主| 发表于 2017-7-13 17:55:41 | 显示全部楼层
Hex 发表于 2017-7-13 17:37
$ext = strtolower(ltrim($this->file_type, '.')); file_type 取出来是 mime 不是 .jpg 这种啊,$this->_m ...

嗯嗯,知道,我粗略的这么写,我想表达的是$ext = ‘jpg’; 而不是 $ext = 'png' , 如果你有时间的话可以试试改扩展名上传的操作,断点看看900那附近的代码,可能你会理解到我想表达的比较不应该是扩展名和真实类型比较,谢谢管理员
发表于 2017-7-13 18:04:55 | 显示全部楼层
niushiluobo 发表于 2017-7-13 17:55
嗯嗯,知道,我粗略的这么写,我想表达的是$ext = ‘jpg’; 而不是 $ext = 'png' , 如果你有时间的话可 ...

你可以把你改过的代码发上来,一起研究一下。
 楼主| 发表于 2017-7-13 20:05:55 | 显示全部楼层
Hex 发表于 2017-7-13 18:04
你可以把你改过的代码发上来,一起研究一下。
PHP复制代码
 
public function is_allowed_filetype($ignore_mime = FALSE)
{
    if ($this->allowed_types === '*')
    {
            return TRUE;
    }
 
    if (empty($this->allowed_types) OR ! is_array($this->allowed_types))
    {
            $this->set_error('upload_no_file_types');
            return FALSE;
    }
 
    $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;
    }
 
    foreach($this->allowed_types as $type)
    {
        if (isset($this->_mimes[$type]))
        {
            $mime = is_array($this->_mimes[$type]) ? $this->_mimes[$type] : array($this->_mimes[$type]);
            if (in_array($this->file_type, $mime))
            {
                return true;
            }
        }
    }
 
    return FALSE;
}
 
复制代码


按照自己的理解改了下后面的判断mime类型的,用真实的类型跟指定允许的类型比较。
刚接触CI框架不久,管理员多多指点

评分

参与人数 1威望 +5 收起 理由
Hex + 5 赞一个!

查看全部评分

发表于 2017-7-14 10:29:42 | 显示全部楼层
niushiluobo 发表于 2017-7-13 20:05
按照自己的理解改了下后面的判断mime类型的,用真实的类型跟指定允许的类型比较。
刚接触CI框架不久,管 ...

我看了一下,你改的代码好像是把以前只检查当前扩展名,改成检查所有已经允许的扩展名?

PS 我帮你修改了代码高亮
 楼主| 发表于 2017-7-14 10:46:40 | 显示全部楼层
Hex 发表于 2017-7-14 10:29
我看了一下,你改的代码好像是把以前只检查当前扩展名,改成检查所有已经允许的扩展名?

PS 我帮你修改 ...

谢谢管理员

我改那部分的意思是验证所有允许的mime类型,因为在
  1. if ($ignore_mime === TRUE)
  2.     {
  3.             return TRUE;
  4.     }
复制代码

这之前是验证扩展名的,这没问题

$ignore_mime  CI的意思应该是要不要验证mime,不忽略的话,接下来就应该是验证mime类型,
那就应该去拿真实的文件mime类型跟允许的做比较了,而不再应该是拿扩展来比较了。

改成这样,也不存在伪造类型问题,故意改后缀或者无意拿到被改过后缀的文件,上传都先经过扩展名验证,被改的扩展名通过后,再验证mime

举例, 当前允许类型:【jpg, jpeg, png】
1,把 test.php(真实php类型) 改名成 test.jpg(伪造) 上传,扩展名通过, mime不通过
2. 把 test.png(真实png类型)改名成 test.jpg(伪造)上传,扩展名通过,mime通过

1是站在黑客角度去看
2是站在普通用户去看

以上是我的理解
 楼主| 发表于 2017-7-14 10:50:41 | 显示全部楼层
Hex 发表于 2017-7-14 10:29
我看了一下,你改的代码好像是把以前只检查当前扩展名,改成检查所有已经允许的扩展名?

PS 我帮你修改 ...

其实也是你说的这个意思
发表于 2017-7-14 15:25:56 | 显示全部楼层
niushiluobo 发表于 2017-7-14 10:50
其实也是你说的这个意思

懂了。。。。哈哈

本版积分规则