2012-04-17 74 views
0

當前用戶可以隨意上傳文件。因此在上傳的文件中有空格,字符如ß, ü等等。與其他用戶相比,可以下載這些文件(包括URL中的空格等)。它以這種方式工作,但根據RFC1738 - Uniform Resource Locators (URL)只能使用字母數字字符[a-zA-Z0-9]和一些特殊/保留字符。我認爲應該避免空的空間。允許用戶上傳/下載文件名的字符

目前我在服務器上的文件名中獲得ß a ß。想要下載文件的用戶從MySQL數據庫(utf8_unicode_ci)獲取正確的字符(ß),因此可以在服務器上找到該文件。

  • 什麼是處理文件名的正確方法?
  • 我應該進行文件名檢查並禁止上傳嗎?
  • 我應該在用戶上傳後重命名服務器上的文件(例如str_replace()urlencode(),...)嗎?

回答

1

只要您的網絡服務器負責處理文件下載,請確保它知道文件系統上的編碼,並且文件系統與您用於上傳的文件名的字符集兼容處理。

只要所有東西在這裏兼容(看起來像使用UTF-8),就不會遇到任何問題。只需確保編碼在您使用的每個位置(文件系統,Web服務器,數據庫服務器,數據庫客戶端連接,瀏覽器,上傳POST請求,文件鏈接提供的HTTP HTML響應等)都正確設置。

如果您打算通過PHP與Content-Disposition頭可以提供文件服務,你應該只允許文件名中的followinig字符:

a-z, A-Z, 0-9, _, - , . 

那是因爲頭有美國之外的字符沒有工作規範-ASCII可打印範圍。

正常情況下,當一個文件上傳時,它的文件名get的規範化。在上傳點進行驗證/消毒也是明智之舉。

+0

如何找出「文件系統上的編碼和文件系統與用於上傳文件名稱的字符集兼容」?是的,應該使用UTF-8。 Web服務器是Apache,數據庫服務器是MySQL 5.0.77,連接使用'SET NAMES utf8'設置,瀏覽器可以是任何人,上傳是通過'POST'和'multipart/form-data',HTML的編碼是'UTF-8 '。在Firebug中,文件鏈接提供的HTTP HTML響應具有'Content-Type \t application/x-www-form-urlencoded',但我從來沒有做過什麼(默認?)。 – testing 2012-04-17 11:43:02

+0

所以'Content-Disposition'不會是我想要的。文件名如何被標準化和驗證? – testing 2012-04-17 11:44:33

+0

@testing:你自己用字符串處理來做到這一點。 – hakre 2012-04-17 11:53:16

1

什麼是處理文件名的正確方法?

你已經在處理它們了;在將它們放入URL參數中以使其符合規範之前,將這些文件名包裝在rawurlencode中。

我應該做一個文件名檢查並禁止上傳嗎?

不,這隻會讓您的用戶煩惱。

我應該在用戶上傳後重命名服務器上的文件嗎?

這可能是一個好主意。您可以使用您選擇的技術生成一個「隨機」名稱,並將「原始」名稱保存在數據庫中。無論何時用戶想要下載文件,都要用他們用來通過Content-Disposition HTTP標頭上傳文件的名稱給它們。

這樣做的好處包括確保您不會因每個用戶的文件系統和服務器的文件系統之間的細微差異而被咬傷,並避免重複的文件名問題。

+0

你的意思是「你已經在處理它們了嗎」?我只將它們移動到另一個位置並將原始文件名保存在數據庫中。內容處置是否適用於所有瀏覽器?是否應只通知用戶使用字母數字字符?一代隨機名稱對SEO有缺點嗎?目前的情況何時會導致問題(有效,但爲什麼)? – testing 2012-04-17 11:19:31