免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2463 | 回复: 10
打印 上一主题 下一主题

[码]这段upload的代码有漏洞没? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-01-19 22:53 |只看该作者 |倒序浏览
环境:PHP Version 4.4.0 AS4

  1. function upload($file, $type = '', $path = '')
  2. {
  3.      global $_FILES, $Config;
  4.    
  5.      if ($_FILES[$file]['size'] > $Config['uploadMaxSize'])
  6.     {
  7.          return false;
  8.          }
  9.     $tmpExt = explode(".", $_FILES[$file]['name']);
  10.      $tmpNum = count($tmpExt)-1;
  11.      $t = strtolower($tmpExt[$tmpNum]);

  12.     if(in_array($t, (explode('|', $type))) == true)
  13.         {
  14.          # copy file to server
  15.         $filename = time() . "_" . rand(0, 10000) . '.' . $t;
  16.          $file_path = $path . '/' . $filename;
  17.         
  18.         
  19.          move_uploaded_file($_FILES[$file]['tmp_name'], $file_path);
  20.         
  21.          return $filename;
  22.          }
  23.     else
  24.         {
  25.          return false;
  26.          }
  27.    
  28.     }
复制代码



  1.      if ($_FILES['pic']['name'])
  2.     {
  3.          $pic = upload('pic', 'jpg|jpeg|gif|bmp|png', $Config['uppath'] . 'pic');
  4.          }
复制代码


请大侠看看上面的代码有漏洞么?为什么?应该怎么改?
谢谢

论坛徽章:
0
2 [报告]
发表于 2006-01-19 23:14 |只看该作者
有漏洞。你通过切割文件名来获得文件类型的方法不安全。
建议检测文件类型用检测MIME类型来判断,print_r($_FILE)一下你就明白了。
如果是图片类的文件。用getimagesize函数来判断很方便

论坛徽章:
0
3 [报告]
发表于 2006-01-20 11:51 |只看该作者
ok
谢谢
改了一下,基本的应该没问题了,就是$_FILES[$file]['type'];依赖浏览器对文件类型的判断

  1.          $mimetype = $_FILES[$file]['type'];
  2.          $mimetypes = array(
  3.     'image/bmp'        => 'bmp',
  4.     'image/png'        => 'png',
  5.         'image/gif'        => 'gif',
  6.         'image/pjpeg'        => 'jpeg',
  7.         'image/pjpeg'        => 'jpg'
  8. );
  9.          $t = $mimetypes[$mimetype];

  10.     if(in_array($t, (explode('|', $type))) == true)
复制代码

论坛徽章:
0
4 [报告]
发表于 2006-01-20 16:06 |只看该作者
楼主and 2楼的,据本版有人说$_FILES['filename']['type']也是依赖文件扩展名来判断文件MIME类型的,所以我建议用mime_content_type()函数来判断:

  1. $mimetype =mime_content_type($_FILES[$file]['tmp_name']);
  2.          $mimetypes = array(
  3.     'image/bmp'        => 'bmp',
  4.     'image/png'        => 'png',
  5.         'image/gif'        => 'gif',
  6.         'image/pjpeg'        => 'jpeg',
  7.         'image/pjpeg'        => 'jpg'
  8. );
  9.          $t = $mimetypes[$mimetype];

  10.     if(in_array($t, (explode('|', $type))) == true)
复制代码

论坛徽章:
0
5 [报告]
发表于 2006-01-20 16:28 |只看该作者
能否正确的判断出上传文件的类型并不是重要的问题
只要保存文件的目录没有执行权,至多只是显示的内容不正确

文件的后缀可以被修改,mime类型也只依赖与文件头,同样是可以被修改的

这个代码的真正问题在于
$filename = time() . "_" . rand(0, 10000) . '.' . $t;
1、rand只是产生随机数,并不能保证是唯一的。在同一时间有大量用户上传时就可能造成文件名相同
2、虽然使用time函数可以减少重名的可能性,但你并不能保证服务器时间不被被修改
3、move_uploaded_file和copy函数都不能改写已存在的文件,遇到同名文件将报错。于是就可能暴露你的服务器目录结构

论坛徽章:
0
6 [报告]
发表于 2006-01-20 17:04 |只看该作者
mime_content_type函数服务器不支持,汗


设定存文件的目录没有执行权,想想重要的还是这个,嘿嘿,不能执行传了你也没用

  1. <Directory "/www/htdocs/upload/">
  2. php_flag engine off
  3. </Directory>
复制代码



  1. $filename = time() . "_" . rand(0, 10000) . '.' . $t;
复制代码

文件名问题应该不大吧,呵呵,我再对同名文件做一个判断吧

谢谢大家:)

论坛徽章:
0
7 [报告]
发表于 2006-01-20 18:21 |只看该作者
原帖由 xuzuning 于 2006-1-20 16:28 发表
这个代码的真正问题在于
$filename = time() . "_" . rand(0, 10000) . '.' . $t;
1、rand只是产生随机数,并不能保证是唯一的。在同一时间有大量用户上传时就可能造成文件名相同
2、虽然使用time函数可以减少重名的可能性,但你并不能保证服务器时间不被被修改
3、move_uploaded_file和copy函数都不能改写已存在的文件,遇到同名文件将报错。于是就可能暴露你的服务器目录结构

filename前再加上一个上传者的session_id,这样应该可以把重名的可能性降到最低了。

论坛徽章:
0
8 [报告]
发表于 2006-01-20 21:19 |只看该作者
mime类型安全吗?
mime类型只是在文件的前头写上类型的名称,
谁不会写呀?

论坛徽章:
0
9 [报告]
发表于 2006-01-20 21:23 |只看该作者
个人认为只要后缀不会变成.php就是安全了

论坛徽章:
0
10 [报告]
发表于 2006-01-20 21:59 |只看该作者
通过mime判断用处也不是很大。很多都会判断错。
例如只能判断文本,而无法区分txt还是php

个人觉得:
用户文件扩展名是什么,你就给他保存为什么就够了。但是,如果用户上传.php.php3.php4.phtml.cgi.pl等你的apache当作scripts来解析的文件。就需要将其文件名称改一下。
例如.php改为._php。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP