我需要清理一些將在文件名中使用的數據。一些數據包含空格和符號字符。是否有一個函數可以轉義或清理適合在文件名(或路徑)中使用的數據?我在PHP手冊的'文件系統功能'部分找不到一個。我應該爲文件名避開/清理哪些字符?
因此,假設我必須編寫自己的函數,哪些字符需要轉義(或更改)?
我需要清理一些將在文件名中使用的數據。一些數據包含空格和符號字符。是否有一個函數可以轉義或清理適合在文件名(或路徑)中使用的數據?我在PHP手冊的'文件系統功能'部分找不到一個。我應該爲文件名避開/清理哪些字符?
因此,假設我必須編寫自己的函數,哪些字符需要轉義(或更改)?
如果您有機會將原始名稱存儲在數據庫中,我只需使用隨機散列(mt_rand()/ md5/sha1)創建一個文件即可。好處是你不需要依賴底層操作系統(字符/路徑長度),用戶輸入的值或長度,而且很難猜測/僞造文件名。也許即使是base64編碼也是一種選擇。
對於Windows:
/ \ : * ? " < > |
Unix上,技術上不算什麼,但在實踐中,同一個列表與Windows將是明智的。
只要您準備在操作文件時在命令行上使用引號,空格或&符就沒有任何問題。
(順便說一句,我試圖通過重命名Windows上的東西從錯誤消息的文件,包括一個冒號,並複製了該列表。)
當消毒字符串的文件名,我們篩選出以下0x20的所有字符,以及<,>,:,「,/,\,|,?和*
對於Windows,如果您不想要-any-副作用,請將」&「添加到列表中。這是在某些數據顯示中顯示「下一個字符是我的熱鍵」的字符(在舊窗口中最常見,但仍然在這裏和那裏彈出)。因此,而不是「M & M」,您會看到「M _M「...後面的字符&符號(空格)是一個「熱鍵」,因此強調。
刪除[a-z0-9 _ \ - 。]之外的所有內容可能是一個好主意。沒有必要這麼嚴格,但有一個目錄列表沒有任何意外,這很舒服。如果你正在使用一些奇怪的字符集,那麼你可能希望在去除違規字符之前將編碼轉換爲平坦的ascii(或者最終刪除所有內容) ...
至少這就是我做它:-)
而不是篩選出字符爲什麼不只是允許[a-z0-9- [email protected]#$%^()]
?這肯定比猜測每個可能導致問題的角色更容易。
您的用戶不應該需要任何其他字符的文件,對吧?
function getSafeFilesystemFileName() {
return (
md5($id . '-' . $filename) .
'.' . pathinfo($filename, PATHINFO_EXTENSION)
);
}
其中:
$id
是從數據庫$filename
記錄ID是原始上傳的文件名(也存儲在記錄)一個重要的事情:將原始擴展名追加到生成的文件中。如果您需要將文件提供給關注擴展名的工具,那麼使用該擴展名將比使用擴展名創建臨時文件要容易得多。
事實上,在安全性/可靠性等方面,白名單似乎總是最好的。 – 2011-02-20 00:50:53