php圖片上傳檢測是否為真實圖片格式

來源:互聯網
上載者:User

標籤:turn   class   bin   unknown   note   case   tar   phpstorm   source   

PHP 圖片上傳,如果不做任何判斷的話,隨便一個檔案如 rar,zip,php,java等檔案改個檔案名稱,改個尾碼就能以圖片形式上傳的伺服器,往往會造成極大的危害!

工具/原料 
  • PHP
  • apache / nginx / iis
  • phpstorm / netbeans / notepad++ / editplus
方法/步驟 
  1. 1

    第一種方法:如果是只是單純判斷是否是圖片格式的話,我使用  getimagesize 方法function checkIsImage($filename){    $alltypes = ‘.gif|.jpeg|.png|.bmp‘;//定義檢查的圖片類型    if(file_exists($filename)){        $result= getimagesize($filename);        $ext = image_type_to_extension($result‘]);        return stripos($alltypes,$ext);    }else{        return false;    }}

  2. 2

    第二種方法比較強大一些,能判斷多種格式function getReailFileType($filename){    $file    = fopen($filename, "rb");    $bin    = fread($file, 2); //唯讀2位元組    fclose($file);    $strInfo    = @unpack("C2chars", $bin);    $typeCode    = intval($strInfo[‘chars1‘].$strInfo[‘chars2‘]);    $fileType    = ‘‘;    switch($typeCode){        case 7790:            $fileType = ‘exe‘;break;        case 7784:            $fileType = ‘midi‘; break;        case 8297:            $fileType = ‘rar‘; break;        case 255216:            $fileType = ‘jpg‘;break;        case 7173:            $fileType = ‘gif‘;break;        case 6677:            $fileType = ‘bmp‘;break;        case 13780:            $fileType = ‘png‘;break;        default:            $fileType = ‘unknown‘;    }    return $fileType;}

  3. 3

    第三種方法:

    PHP  gd類庫函數提供了一個exif_imagetype() 函數, 用來讀取映像的第1個位元組, 還會對圖片的簽名做檢查。 如果格式不對,會返回false。 其實啊, 這個方法和第一種方法有異曲同工之妙。 但是因為這個是庫函數,效率要比第一種方法高得多。

     

    此函數用法很簡單,傳入路徑,然後通過判斷是否等於某個常量,  例如 gif格式的IMAGETYPE_GIF

    thinkphp有用到這個判斷www\thinkphp\library\think\Validate.php

  4. 4

    第四種方法:php重繪

    效率很低的一種方法,但也是一種思路: 把傳輸過來的檔案,不論什麼檔案都以resource 類型繪到圖片中去, 如果是圖片,能還原出來。如果不是圖片,那繪畫不出來,而且裡面的危險代碼也沒有了。

    具體請看:

  5. 5總結: 我曾經在網上看到過有人說:相信懂得php的人都用過XX函數。 我開啟一看,就是一個使用尾碼來判斷上傳類型的函數。 同學在做類似功能的時候一定要揭開表現看到本質,否則經過偽裝的圖片在上傳之後,會對伺服器造成極大安全隱患

php圖片上傳檢測是否為真實圖片格式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.