開發文件上傳功能稍不注意就會引發安全漏洞
1. 前言
文件上傳在日常開發中十分常見,但是潛在的安全問題非常容易忽視。一旦開發中忽視了這些問題,將會引發系統安全漏洞。
2. 文件上傳開發的安全建議
通常我們上傳的文件是由客戶端控制的,這種情況下就給了不懷好意人可乘之機。一些危險的可執行腳本將有可能被注入服務器中去。因此胖哥總結了以下幾點建議。
文件類型過濾
開發者應該有一個過濾清單允許上傳的文件類型應僅限于業務功能所需的文件類型,在沒有允許列表過濾器的情況下,切勿直接接受文件名及其擴展名,同時前端應該對該清單進行說明。這是一個必要的步驟,大多數開發者也做得很好。
文件名稱處理
不能使用原始文件名!這是一個容易被忽略的問題。很多開發者喜歡直接把上傳文件的按照原始文件名進行轉存。
- // Spring boot 開發中不建議使用這個來作為轉存的名稱,你應該生成一個新的名稱來映射此名稱
- String originalFilename = MultipartFile.getOriginalFilename();
這樣是不安全的。雖然大部分/\:<>?字符已經被過濾掉,但是. * % $,這些腳本中的常客依然可以被包含在文件名中,所以不能使用原始文件名,你應該指定一個算法來進行重命名,建議使用一種摘要算法來確定文件名。例如,文件名可以是文件名加上日期的 MD5 哈希。
如果業務需要原始文件名的話存儲新的命名和原始名稱的映射即可。
摘要校驗
服務端無論上傳、修改還是下載文件都需要進行摘要校驗(MD5、SHA256),以防止文件和預設的不一致。客戶端有必要的情況下也建議進行摘要校驗。
限制大小
這一點如果使用 Spring 進行開發的話已經做了限制,如果該限制不滿足業務需要,可以修改,但是不能移除限制,否則會導致拒絕服務攻擊。
訪問限制
如果不是業務需要,只有身份驗證和授權的用戶才能使用文件上傳功能。不然你的系統就成了別人的免費圖床。
行為審計
對于安全我們只能被動防御,因此對文件上傳的操作建議有審計日志、而且審計日志不應該受文件系統影響,這樣發生安全事件時可以快速定位問題。
3. 總結
其實還有不少的安全要點需要考慮,只不過目前大部分都使用了第三方存儲,如果使用自研的系統可能需要考慮的更多。不過針對普通開發來說做到上面的幾點就夠了。
本文轉載自微信公眾號「 碼農小胖哥」,可以通過以下二維碼關注。轉載本文請聯系碼農小胖哥公眾號。