在處理文件上傳或文件操作時,文件名的安全性和合法性非常重要。非法的文件名可能導致系統錯誤、安全漏洞甚至文件覆蓋風險。本文介紹了一種基於PHP 的自定義函數mb_scrub ,用於過濾和規範文件名字符串,尤其適合包含多字節字符的場景。
編碼統一<br> 為了正確處理多字節字符(如中文、日文、韓文等),首先使用mb_convert_encoding將輸入字符串統一轉成UTF-8 編碼,避免字符截斷或亂碼
字符過濾<br> 通過正則表達式,保留特定的合法字符集合通常文件名允許的字符有:
英文字母(大小寫)
數字
下劃線_
句點.
連字符-
這些字符既能滿足大多數文件名需求,也避免了特殊字符帶來的風險。
避免特殊開頭<br> 文件名以點開頭通常表示隱藏文件或特殊系統文件用ltrim去掉開頭多餘的點,確保不會無意中創建隱藏文件。
空字符串保護<br> 如果過濾後文件名為空字符串,自動賦予一個默認文件名(如default_filenam e ),防止後續文件操作出錯
示例中輸入文件名為非法文件名<>:"/\|?*.txt ,其中包含了許多非法字符。經過mb_scrub處理後,只剩下允許的字符,示例輸出如下:
<span><span><span class="hljs-section">原始文件名:非法文件名<>:"/\|?*.txt</span></span><span>
過濾後文件名:txt
</span></span>
這裡示例較為簡單,實際項目中可以根據需求對允許字符集進行調整,或者結合額外規則(如限制長度、限制擴展名等)。
結合文件擴展名檢查:過濾文件名的同時,還應單獨驗證擴展名的合法性,防止惡意腳本文件上傳。
限製文件名長度:避免文件名過長導致系統兼容性問題。
路徑安全:過濾文件名不能完全代替路徑安全檢查,防止目錄遍歷等漏洞。
多語言支持: mb_scrub對多字節字符支持較好,適合國際化應用。
通過合理使用類似mb_scrub的函數,可以極大提昇文件名處理的安全性和穩定性,是PHP 文件上傳或文件操作的重要步驟之一。