最新公告
  • 欢迎您光临波比源码,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • PHP文件上传一些小收获

    又码了一个周末的代码,这次在做一些关于文件上传的东西,(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来.

    开始觉得这玩意很简单,结果嘛惨不忍睹.用CodeIgniter的上传类来上传文件,一开始进展蛮顺利的,但发觉走到上传文件类型的时候就走不下去了,我明明添加了.torrent类型为可上传类型,结果无论我怎么传也传不上去,还提示我上传文件类型不对.汗森了,这可是货真价实的种子文件啊,难道CI只认可岛国的种子吗?

    打开CI的上传类看代码,原来CI的UPLOAD是通过判断文件的来实现文件识别的.难怪,种子的MIME类型在一般浏览器上返回的都是二进制数据类型,看来只有自己动手改造一下了.

    为了尽快完成项目,我直接从控制器(Controller)开始写代码.用$_FILE['file']['name']获取上传文件的文件名,然后用explode函数来获取后缀名,最后再调用CI的UPLOAD来上传文件.

    PHP实例代码如下:

    1. $config['upload_path'] = './uploads/';    
    2. $config['allowed_types'] = '*';    
    3. $config['max_size'] = '100';    
    4. $this->load->library('upload',$config);    
    5. $this->load->helper('security');    
    6. $this->load->helper('date');    
    7. $this->load->helper('url');    
    8. $this->load->model('bt_model','',TRUE);    
    9. $data['source_url'] = base_url().'source';    
    10. $data['base_url'] = base_url();    
    11. $file = $_FILES['upload_file']['name'];    
    12. $file_1 = explode('.',$file);    
    13. $file_2 = $file_1[count($file_1)-1];    
    14. if($file_2 <> 'torrent'){    
    15.     echo '<script>alert("只能上传类型为torrent的种子文件");</script>';    
    16.     echo '<script>window.location.href="'.$data['base_url'].'index.php/index/post";</script>';    
    17.     return;    
    18. }    
    19. $data['type'] = xss_clean($this->input->post('type'));    
    20. $data['name'] = xss_clean($this->input->post('name'));    
    21. $data['space'] = xss_clean($this->input->post('space'));    
    22. $data['username'] = xss_clean($this->input->post('username'));    
    23. $data['time'] = mdate('%Y-%m-%d %G:%i',gmt_to_local(time(),'UP8'));    
    24. if($data['type'] == '' || $data['name'] == '' || $data['space'] == '' || $data['username'] == ''){    
    25.     echo '<script>alert("信息填写不完整,请重新填写");</script>';    
    26.     echo '<script>window.location.href="'.$data['base_url'].'index.php/index/post";</script>';    
    27.     return;    
    28. }    
    29. $this->upload->do_upload('upload_file');    
    30. echo $this->upload->display_errors();    
    31. $file = $this->upload->data();    
    32. $data['url'] = $data['base_url'].'uploads/'.$file['file_name'];    
    33. $this->bt_model->insert($data);    
    34. echo '<script>alert("上传成功");</script>';    
    35. echo '<script>window.location.href="'.$data['base_url'].'";</script>'

    原理大致是这样的,获取上传文件的文件名,然后通过explode()函数来分割文件名以获取后缀,得到后缀之后与允许上传类型做比较,最后上传.

    讲到上传,我又想到了原来那个特别流行的MIME上传漏洞.很简单,当网站判断上传文件类型时只判断MIME类型那么就会造成上传漏洞.因为上传时服务器得到的MIME类型是从客户端发过来的,也就是说MIME类型的值是可以被用户控制的,攻击者克构造虚假的MIME类型来上传webshell.

    所以判断文件类型的时候还是检测文件后缀名吧,最好只给上传目录一个可读权限,关闭执行权限,这样比较靠谱.

    波比源码 – 精品源码模版分享 | www.bobi11.com
    1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
    3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    5. 如有链接无法下载、失效或广告,请联系管理员处理!
    6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
    7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

    波比源码 » PHP文件上传一些小收获

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    波比源码
    一个高级程序员模板开发平台
    升级波友尊享更多特权立即升级