国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

PHP文件上傳一些小收獲

2024-05-04 21:57:28
字體:
供稿:網(wǎng)友

又碼了一個周末的代碼,這次在做一些關(guān)于文件上傳的東西,(PHP UPLOAD)小有收獲項目是一個BT種子列表,用戶有權(quán)限上傳自己的種子,然后配合BT TRACK服務(wù)器把種子的信息寫出來.

開始覺得這玩意很簡單,結(jié)果嘛慘不忍睹.用CodeIgniter的上傳類來上傳文件,一開始進展蠻順利的,但發(fā)覺走到上傳文件類型的時候就走不下去了,我明明添加了.torrent類型為可上傳類型,結(jié)果無論我怎么傳也傳不上去,還提示我上傳文件類型不對.汗森了,這可是貨真價實的種子文件啊,難道CI只認可島國的種子嗎?

打開CI的上傳類看代碼,原來CI的UPLOAD是通過判斷文件的來實現(xiàn)文件識別的.難怪,種子的MIME類型在一般瀏覽器上返回的都是二進制數(shù)據(jù)類型,看來只有自己動手改造一下了.

為了盡快完成項目,我直接從控制器(Controller)開始寫代碼.用$_FILE['file']['name']獲取上傳文件的文件名,然后用explode函數(shù)來獲取后綴名,最后再調(diào)用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()函數(shù)來分割文件名以獲取后綴,得到后綴之后與允許上傳類型做比較,最后上傳.

講到上傳,我又想到了原來那個特別流行的MIME上傳漏洞.很簡單,當網(wǎng)站判斷上傳文件類型時只判斷MIME類型那么就會造成上傳漏洞.因為上傳時服務(wù)器得到的MIME類型是從客戶端發(fā)過來的,也就是說MIME類型的值是可以被用戶控制的,攻擊者克構(gòu)造虛假的MIME類型來上傳webshell.

所以判斷文件類型的時候還是檢測文件后綴名吧,最好只給上傳目錄一個可讀權(quán)限,關(guān)閉執(zhí)行權(quán)限,這樣比較靠譜.

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 伊川县| 澄城县| 连江县| 巴彦县| 盐城市| 临泽县| 宜兴市| 玉山县| 吴旗县| 苗栗市| 巴中市| 宁乡县| 会东县| 井冈山市| 临江市| 舞阳县| 昭平县| 射阳县| 桑日县| 无锡市| 宜宾市| 四平市| 剑河县| 建始县| 宜宾县| 云南省| 禄丰县| 新晃| 奈曼旗| 河东区| 嵊州市| 汾阳市| 尖扎县| 铁岭市| 临西县| 凤阳县| 金寨县| 称多县| 油尖旺区| 郧西县| 噶尔县|