1. 程式人生 > >php 圖片上傳安全探討

php 圖片上傳安全探討

PHP 圖片上傳安全探討

[問題發現]

今天想做一個圖片上傳的操作類,在網上找了些demo,發現大家對上傳的檔案,會先對檔案型別進行校驗,

校驗的方式基本上就是獲取 $_FILES["upfile"]["type"] 然後匹配自己限制的mime型別,

邏輯上是對的,

但是,問題在於我無意中看到一篇文章說$_FILES["upfile"]["type"] 的值來自於瀏覽器對檔案型別的判斷。

我馬上想到了其中的安全隱患,

換句話說,一旦我們網頁post的資料離開了劉瀏覽器,就可以被隨意篡改,包括上傳檔案的型別,

[實驗階段]

現在我們做個小實驗,我們自己寫個web頁面上傳圖片,後臺對檔案型別進行判斷,並儲存檔案!

這個是我們建立的一個簡單的圖片上傳表單:


隨便上傳一張圖片,通過fiddler除錯,我們可以看到圖片上傳是的請求頭


圖片也上傳成功了伺服器


接下來,我們上傳一個php檔案上去,


可以看到,php檔案的mime為application/octet-stream,並沒有通過後臺稽核


那麼我們現在通過fillder,直接修改CONTENT-TYPE的值,然後提交資料

檔案竟然通過了後臺的稽核,傳送到了伺服器


然後,我們嘗試著訪問這個php檔案,竟然可以正常的訪問,可以想象,如果這個檔案裡包含的是刪除某些目錄或者更加危險的行為,那將是非常危險的。


更無語的是,如果我們自是簡單的把檔案的字尾名改成,jpeg,png,等等,瀏覽器都校驗其為圖片型別。

[應對思路方法]

既然上傳的檔案資訊可以被隨意篡改,那麼,我們的思路就是,對上傳到本地的臨時檔案做校驗,這樣就避免了客戶端提交資訊的不安全性。

就php而言,可以通過Fileinfo函式獲取伺服器的檔案型別。經測試,不過是通過fiddler修改請求頭,還是直接修改檔案字尾,Fileinfo函式都能正確地校驗檔案型別。

希望平時通過$_FILES校驗檔案的朋友,可以過一些安全的防護,也希望朋友們多多瀏覽,談談你對檔案上傳安全的寶貴意見!