2011-06-04 81 views
2

我想在Ruby on Rails中創建一個簡單的文件存儲庫。用戶擁有自己的帳戶,登錄後可以上傳文件或下載先前上傳的文件。Ruby on Rails中的文件存儲庫

這裏的問題是安全性。文件應該是安全的,除了業主以外的任何人都無法使用。

  1. 哪裏,我應該在哪個文件夾中存儲文件,以使它們儘可能安全?
  2. 重新命名上傳的文件,將名稱存儲在數據庫中並在需要時恢復它們是否有意義?這可能有助於避免名稱衝突,但我不確定這是否是一個好主意。
  3. 文件是否應該全部存儲在一個文件夾中,還是應該有所分割?

回答

5
  • 重命名的文件,其中一個原因,是因爲你沒有辦法知道,如果今天的文件「測試」應該取代上週的「測試」或沒有(也許是用戶必須在不同的目錄)
  • 給每個用戶自己的目錄,這樣可以防止性能問題,並可以很容易地遷移,歸檔或刪除單個用戶在數據庫
  • 放的元數據和文件在文件系統
  • 通過文件看出來的代碼注入名稱
+1

聽起來像體驗的聲音。 :-) – 2011-06-04 20:56:28

+0

我也會添加它可能有助於清理文件名。不幸的是文件名並不是所有操作系統都普遍接受的。 – 2011-06-04 21:05:01

1

對於簡單的情況下(在您不希望分發的文件存儲):

  1. 商店中tmp目錄中的文件。請勿將它們存儲在public中。然後只通過一個路由和控制器來進行身份驗證/授權檢查。

  2. 我看不到任何理由重命名文件;您可以根據用戶標識將它們分成子目錄。但是,如果您想允許上傳具有相同名稱的文件,那麼您可能需要爲每個文件的名稱生成一個唯一的哈希值或其他值。

  3. 見上。您可以按照您認爲合適的方式對其進行分區。但我肯定會建議對它們進行分區,而不是將它們集中在一個目錄中。

+0

我不確定我會用'tmp'。我會創建一個單獨的分區,最好安裝在一個單獨的驅動器上,因此可以輕鬆擴展。 'tmp'用於臨時存儲。 – 2011-06-04 21:00:57

3

這是一個有趣的問題。根據安全級別要應用我想提出以下建議:

  1. 選擇一個文件夾只有通過你的應用服務器進行訪問(如果您選擇在FS存儲)

  2. 我總是建議將文件重命名爲隨機生成的哈希(或者像URL短縮中使用的漸進生成的名稱,請參閱rubyurl的開源實現)。但是,我不會將它們存儲在數據庫中,因爲文件系統是爲處理文件而構建的,因此請讓它完成這項工作。您應該將元數據存儲在數據庫中,以便能夠在用戶下載文件時設置正確的文件名。

  3. 您應該在多個文件夾之間對文件進行分區。這給你多重優勢。首先,文件系統不是用來處理單個文件夾中的數百萬個文件的。如果您的操作嘗試從文件夾中獲取所有文件,則需要更多時間。如果您對原始文件名稱進行了模糊處理,則可以爲文件名中的每個字母創建一個目錄,並且每個目錄將獲得相當好的分佈數量的文件。

要考慮的最後一件事是可能的文件名衝突。用戶不應該能夠猜測來自另一個用戶的文件名。所以你可能在這裏需要一些額外的檢查。

根據您希望實現的安全級別,您可以應用越來越多的模式。

2

只是不要將文件保存在公用文件夾中,並創建一個將發送文件的控制器。

如何從這一點開始組織起來就是您的選擇。您可以爲每個用戶創建一個子文件夾。沒有必要從安全角度重新命名,但是嘗試清理文件名,空格和非ASCII字符會讓事情變得更加困難。