PHP文件上传一些小收获
开始觉得这玩意很简单,结果嘛惨不忍睹。用CodeIgniter的上传类来上传文件,一开始进展蛮顺利的,但发觉走到上传文件类型的时候就走不下去了。我明明添加了.torrent类型为可上传类型,结果无论我怎么传也传不上去,还提示我上传文件类型不对。汗森了,这可是货真价实的种子文件啊,难道CI只认可岛国的种子吗?
打开CI的上传类看代码,原来CI的UPLOAD是通过判断文件的来实现文件识别的。难怪,种子的MIME类型在一般浏览器上返回的都是二进制数据类型,看来只有自己动手改造一下了。
为了尽快完成项目,我直接从控制器(Controller)开始写代码。用$_FILE['file']['name']获取上传文件的文件名,然后用explode函数来获取后缀名,最后再调用CI的UPLOAD来上传文件。代码如下:
PHP代码
<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy1068')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy1068>$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。
所以判断文件类型的时候还是检测文件后缀名吧,最好只给上传目录一个可读权限,关闭执行权限,这样比较靠谱。
您可能感兴趣的文章:
php文件上传代码大全(实例分享)
php 文件上传实例剖析
php 上传大文件时需要做的设置
php接口如何传输图片
有关php上传文件的方法浅析
了解PHP文件上传相关知识
解决PHP上传大文件的问题
php.ini修改php上传文件大小限制的方法小结
PHP文件上传一些小收获
PHP设置图片文件上传大小的方法