1. 程式人生 > >php圖片上傳檢測是否為真實圖片格式

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

notepad++ exif -h 只讀 all item apach gif sel

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圖片上傳檢測是否為真實圖片格式