PHP文件上传一些小收获
发布:smiling 来源: PHP粉丝网 添加日期:2014-02-24 10:08:35 浏览: 评论:0
又码了一个周末的代码,这次在做一些关于文件上传的东西,(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来.
开始觉得这玩意很简单,结果嘛惨不忍睹.用CodeIgniter的上传类来上传文件,一开始进展蛮顺利的,但发觉走到上传文件类型的时候就走不下去了,我明明添加了.torrent类型为可上传类型,结果无论我怎么传也传不上去,还提示我上传文件类型不对.汗森了,这可是货真价实的种子文件啊,难道CI只认可岛国的种子吗?
打开CI的上传类看代码,原来CI的UPLOAD是通过判断文件的来实现文件识别的.难怪,种子的MIME类型在一般浏览器上返回的都是二进制数据类型,看来只有自己动手改造一下了.
为了尽快完成项目,我直接从控制器(Controller)开始写代码.用$_FILE['file']['name']获取上传文件的文件名,然后用explode函数来获取后缀名,最后再调用CI的UPLOAD来上传文件.
PHP实例代码如下:
- $config['upload_path'] = './uploads/';
- $config['allowed_types'] = '*';
- $config['max_size'] = '100';
- $this->load->library('upload',$config);
- $this->load->helper('security');
- $this->load->helper('date');
- $this->load->helper('url');
- $this->load->model('bt_model','',TRUE);
- $data['source_url'] = base_url().'source';
- $data['base_url'] = base_url();
- $file = $_FILES['upload_file']['name'];
- $file_1 = explode('.',$file);
- $file_2 = $file_1[count($file_1)-1];
- if($file_2 <> 'torrent'){
- echo '<script>alert("只能上传类型为torrent的种子文件");</script>';
- echo '<script>window.location.href="'.$data['base_url'].'index.php/index/post";</script>';
- return;
- }
- $data['type'] = xss_clean($this->input->post('type'));
- $data['name'] = xss_clean($this->input->post('name'));
- $data['space'] = xss_clean($this->input->post('space'));
- $data['username'] = xss_clean($this->input->post('username'));
- $data['time'] = mdate('%Y-%m-%d %G:%i',gmt_to_local(time(),'UP8'));
- if($data['type'] == '' || $data['name'] == '' || $data['space'] == '' || $data['username'] == ''){
- echo '<script>alert("信息填写不完整,请重新填写");</script>';
- echo '<script>window.location.href="'.$data['base_url'].'index.php/index/post";</script>';
- return;
- }
- $this->upload->do_upload('upload_file');
- echo $this->upload->display_errors();
- $file = $this->upload->data();
- $data['url'] = $data['base_url'].'uploads/'.$file['file_name'];
- $this->bt_model->insert($data);
- echo '<script>alert("上传成功");</script>';
- echo '<script>window.location.href="'.$data['base_url'].'";</script>';
原理大致是这样的,获取上传文件的文件名,然后通过explode()函数来分割文件名以获取后缀,得到后缀之后与允许上传类型做比较,最后上传.
讲到上传,我又想到了原来那个特别流行的MIME上传漏洞.很简单,当网站判断上传文件类型时只判断MIME类型那么就会造成上传漏洞.因为上传时服务器得到的MIME类型是从客户端发过来的,也就是说MIME类型的值是可以被用户控制的,攻击者克构造虚假的MIME类型来上传webshell.
所以判断文件类型的时候还是检测文件后缀名吧,最好只给上传目录一个可读权限,关闭执行权限,这样比较靠谱.
Tags: PHP CodeIgniter
相关文章
- ·PHP 是什么?(2013-11-12)
- ·Php.ini文件位置在哪里 Php.ini文件找不到(2013-11-12)
- ·PHP 数据类型(2013-11-12)
- ·php 获取当前脚本的url(2013-11-12)
- ·php技术生成静态页面的实现(2013-11-13)
- ·缺陷月项目启动 披露PHP脚本语言漏洞(2013-11-13)
- ·在PHP中全面阻止SQL注入式攻击(2013-11-13)
- ·php生成随机密码的几种方法(2013-11-13)
- ·PHP中使用FCKeditor2.3.2配置(2013-11-13)
- ·如何使用PHP开发高效的WEB系统(2013-11-13)
- ·php:树形结构的算法(2013-11-13)
- ·php4和php5区别(2013-11-13)
- ·php数据库连接(2013-11-13)
- ·如何正确理解PHP的错误信息(2013-11-13)
- ·php页面漏洞分析及相关问题解决(2013-11-13)
- ·当在连接PHP时,抱怨一些数值没有定义参考?(2013-11-27)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)