PHP 文件上傳安全需要注意哪些方面?
12-03
最安全的做法是,強制後綴名,而不要使用用戶上傳文件的後綴名,比如先判斷下是不是jpg後綴,是則強制保存文件名後綴為jpg,不是的話禁止上傳。不要使用mime-type進行檢查,可以很輕鬆繞過的。
1. 文件類型校驗,不能只檢查文件名(比如對後綴名做一個正則表達式匹配是不夠的,不管是黑名單還是白名單,mime-type檢查是第二道防線,文件頭檢查是第三道防線),不安全的文件類型一律禁止上傳。防止被上傳webshell、惡意代碼。
2. 文件名清洗(接受數據時的臨時文件名隨機化、存儲在文件系統上的文件名隨機化、存儲在資料庫中的文件名要各種轉義)。防止各種注入攻擊、XSS。
3. 檢查文件大小。防止DoS攻擊。
4. 做好Web伺服器安全加固。例如防止基於Web伺服器運行環境的DoS攻擊(例如Slowris、POST DoS等),上傳文件目錄的訪問控制授權等。
1、判斷上傳文件的擴展名和mimetype,還可以掃描 &2、上傳的文件不要保存為原名,要保存為對方猜不到的文件名(如文件加鹽hash或隨機字元串+文件hash,不帶擴展名),和原名一起保存在資料庫里。
3、上傳的文件要保存在Web伺服器的http不能訪問到,但PHP可以讀出來的路徑,或者乾脆保存在內網另一台伺服器上,而下載/使用的時候單獨用一個PHP來讀,向瀏覽器返回真實文件名(這樣要支持分塊下載就有點麻煩了)。同時要保證這個PHP、機器上php版本沒有可以利用文件操作來執行任意代碼的漏洞。
對於文件的類型,大小進行限制,前者需要php代碼實現, 後者可以通過php.ini控制, 如果對於安全性要求很高, 得做個客戶傳遞的文件名永遠都是不可信任的假設, 然後對上傳的文件mine-type進行檢查, 因為惡意的文件經常會被偽裝成無辜的文件.
- 禁止上傳目錄的PHP解析,避免通過成為webshell;
- 通過clamav對上傳文件進行掃描,避免其它用戶下載到病毒,遏制病毒傳播;
強制後綴名,判斷後綴名與上傳的mine-type是否一致(不一致就可判斷是偽裝的),如果是圖片格式,檢測文件頭。上傳後強制重命名
在linux下要設置文件許可權,上傳的文件如圖片文檔什麼的要設置成沒有執行的許可權,這樣會安全很多
推薦閱讀:
※該學習哪些PHP函數? PHP常用函數?
※一名合格的PHP工程師的知識結構是怎樣的?
※Python 是否是下一個 PHP?為什麼?