如何檢查上傳圖檔
網站如果要開放讓使用者上傳圖檔,通常都在上傳介面中先做副檔名檢查,做第一層的篩選。但基於資安的考量,還是無法相信使用者上傳的圖檔是沒問題的。尚須對這些上傳到伺服器上的圖檔做檢查。
我們假設圖檔可能會有下列的狀況,要能檢查出來
以php而言,最簡單的方式可以採用getimagesize()來取得圖檔相關資訊來做判斷。以上述第一個狀況而言,getimagesize()會回傳FALSE,就可以檢查出來。
不過,第二個狀況就檢查不出來,因為他算是合法的圖檔。使用getimagesize()會得到如下的資訊…
要能檢測出第二個項目或類似的狀況,除了head內的資訊外,尚須配合實際讀取圖檔內容來比對。此時,可以利用
getID3。
誠如getID3官方網站上的自我介紹 『getID3() is a PHP script that extracts useful information from MP3s & other multimedia file formats』。我們藉由getID3讀取出圖檔的相關資訊,然後做判斷、檢查圖檔是否正常。
getID3的使用非常簡單,以官方的範例程式 demo.basic.php 舉例,三行程式碼就可以取得 /tmp/upload/lovemachine00.png 的圖檔資訊了。簡單吧!
如果被檢查的圖檔有異常,
getID3回傳的array中,會有['warning']。因此,可以利用此資訊做判斷上的參考。接下來的判斷與應用,就看各自發揮了…
我也曾做個測試,亂改正常圖檔的binary內容,再利用getID3分析,也會有['warning']。
最後,附上以var_dump呈現getID3回傳的內容。請注意第28行處['warning']的內容!
附註:原始資訊太多,內容我有做些刪除與調整
我們假設圖檔可能會有下列的狀況,要能檢查出來
- 圖檔的附檔名是否符合檔案實際格式?
如,將 .zip 改名為 .png - 圖檔是否被塞入其他資訊?
如,利用愛的機器,做出加工的圖檔
以php而言,最簡單的方式可以採用getimagesize()來取得圖檔相關資訊來做判斷。以上述第一個狀況而言,getimagesize()會回傳FALSE,就可以檢查出來。
不過,第二個狀況就檢查不出來,因為他算是合法的圖檔。使用getimagesize()會得到如下的資訊…
- array
- 0 => int 120
- 1 => int 92
- 2 => int 3
- 3 => string 'width="120" height="92"' (length=23)
- 'bits' => int 8
- 'mime' => string 'image/png' (length=9)
誠如getID3官方網站上的自我介紹 『getID3() is a PHP script that extracts useful information from MP3s & other multimedia file formats』。我們藉由getID3讀取出圖檔的相關資訊,然後做判斷、檢查圖檔是否正常。
getID3的使用非常簡單,以官方的範例程式 demo.basic.php 舉例,三行程式碼就可以取得 /tmp/upload/lovemachine00.png 的圖檔資訊了。簡單吧!
- // include getID3() library (can be in a different directory if full path is specified)
- require_once('../getid3/getid3.php');
- // Initialize getID3 engine
- $getID3 = new getID3;
- // Analyze file and store returned data in $ThisFileInfo
- $ThisFileInfo = $getID3->analyze('/tmp/upload/lovemachine00.png');
我也曾做個測試,亂改正常圖檔的binary內容,再利用getID3分析,也會有['warning']。
最後,附上以var_dump呈現getID3回傳的內容。請注意第28行處['warning']的內容!
附註:原始資訊太多,內容我有做些刪除與調整
- array
- 'GETID3_VERSION' => string '1.9.1-20110810' (length=14)
- 'filesize' => int 521399
- 'filename' => string 'lovemachine00.png' (length=17)
- 'filepath' => string '/tmp/upload/ (length=16)
- 'filenamepath' => string '/tmp/upload/lovemachine00.png' (length=34)
- 'avdataoffset' => int 0
- 'avdataend' => int 521399
- 'fileformat' => string 'png' (length=3)
- 'video' =>
- array
- 'dataformat' => string 'png' (length=3)
- 'lossless' => boolean false
- 'resolution_x' => int 120
- 'resolution_y' => int 92
- 'bits_per_sample' => int 8
- 'compression_ratio' => float 47.228170289855
- 'tags' =>
- array
- 'png' =>
- array
- 'Title' =>
- array
- ...
- 'Software' =>
- array
- ...
- 'warning' =>
- array
- 0 => string 'Unhandled chunk type: r60=' (length=26)
- 'encoding' => string 'UTF-8' (length=5)
- 'mime_type' => string 'image/png' (length=9)
- 'png' =>
- array
- 'IHDR' =>
- array
- 'header' =>
- array
- ...
- 'width' => int 120
- 'height' => int 92
- 'raw' =>
- array
- ...
- 'compression_method_text' => string 'deflate/inflate' (length=15)
- 'color_type' =>
- array
- ...
- 'PLTE' =>
- array
- 'header' =>
- array
- ...
- 0 => int 2629661
- 1 => int 12559029
- 2 => int 9390909
- 3 => int 14665142
- 4 => int 3878976
- 5 => int 14723760
- 6 => int 14928859
- 7 => int 11834011
- 8 => int 14665936
- 9 => int 6435882
- 10 => int 14459822
- 124 => int 15458279
- 125 => int 15453903
- 126 => int 15190999
- more elements...
- 'tEXt' =>
- array
- 'header' =>
- array
- ...
- 'keyword' => string 'Software' (length=8)
- 'text' => string 'ViX' (length=3)
- 'comments' =>
- array
- 'Title' =>
- array
- ...
- 'Software' =>
- array
- ...
- 'IDAT' =>
- array
- 0 =>
- array
- ...
- 'IEND' =>
- array
- 'header' =>
- array
- ...
- 'r60=' =>
- array
- 'header' =>
- array
- ...
- 'encoding' => string 'UTF-8' (length=5)
- 'tags_html' =>
- array
- 'png' =>
- array
- 'Title' =>
- array
- ...
- 'Software' =>
- array
- ...
- 'comments' =>
- array
- 'Title' =>
- array
- 0 => string 'ishiguro04.png' (length=14)
- 'Software' =>
- array
- 0 => string 'ViX' (length=3)
- 'comments_html' =>
- array
- 'Title' =>
- array
- 0 => string 'ishiguro04.png' (length=14)
- 'Software' =>
- array
- 0 => string 'ViX' (length=3)
留言