為多個客戶端安全地儲存和提供文件
我們正在開發一個網路應用程序,我們的使用者可以在其中(以及其他功能)上傳他們的文件。但是我們無法將這些文件儲存在我們的 VPS 上,因為儲存空間有限,所以我們決定使用 S3。
主要問題是我們必須確保使用者只能訪問他們自己的數據。因此,我們在數據庫中保留文件列表,以及有權訪問它們的使用者列表。我們的伺服器可以輕鬆地確定使用者是否有權訪問文件。但是如何實際向使用者提供文件呢?
我已經考慮過一些可能性,但實際上沒有一個是最好的。
- 使用 PHP 生成(過期)簽名的 url
這是一個非常簡單的方法,它也很快,但會導致非常難看和長的 url。
- 混淆的 URL
這意味著,我們將文件公開以供在 S3 上讀取,但所有文件都儲存在難以猜測的命名文件夾中,例如:
24fa0b8ef0ebb6e99c64be8092d3ede20000
. 但是,也許這不是最安全的方法。即使您永遠猜不到文件夾名稱,在您知道它之後(因為您實際上可以訪問它),您可以與任何人(與任何未經授權的人)共享該連結。
- 通過我們的伺服器下載文件
這意味著文件不是由 S3 直接提供的,而是首先我們的伺服器安全地讀取並提供服務。我們真的不想要這個:)
4.檢查推薦人
通過“確保”請求來自我們的伺服器(您可以設置 S3 來檢查引薦來源網址),可以改進*混淆 URL解決方案。*然而,這將是一個非常不可靠的解決方案,因為並非所有瀏覽器都會發送引用數據,而且它也可能被偽造。
為不同的客戶端安全地從 Amazon S3 提供文件的好方法是什麼?
這對你來說真的接近於“做我的系統架構”,但是你的四個想法是可變安全性的有趣案例研究,所以讓我們執行你的選項,看看它們的表現如何:
4.檢查推薦人
推薦人由客戶提供。信任客戶端提供的身份驗證/授權數據幾乎會使安全性無效(我只能聲稱是從您期望我來自的地方發送的)。
判決: TERRIBAD想法 - 微不足道的繞過。
- 通過我們的伺服器下載文件
不錯的主意,只要您願意花費頻寬來實現它,並且您的伺服器是可靠的。
假設您已經解決了普通伺服器/應用程序的安全問題,這是您提供的選項中最安全的。
**結論:**很好的解決方案。非常安全,但如果頻寬是一個因素,則可能不是最理想的。
- 混淆的 URL
通過默默無聞的安全?真的嗎?不
,我什至不打算分析它。就是不行。
結論:如果#4 是TERRIBAD**,這就是TERRIWORSE,因為人們甚至不必費力打造引薦來源標頭。猜一串數據,贏
大獎!
- 使用 PHP 生成(過期)簽名的 url
這個選項的吸商很低。
任何人都可以點擊 URL 並獲取數據,這是一個安全禁忌,但您可以通過使連結過期來緩解這種情況(只要連結壽命足夠短,漏洞視窗就很小)。
URL 過期可能會給一些想要長時間掛在下載連結,或者沒有及時獲取連結的使用者帶來不便——這有點糟糕的使用者體驗,但它可能是值得的.
結論:不如#3 好,但如果頻寬是一個主要問題,它肯定比#4 或#2 好。
我會怎麼做?
鑑於這些選項,我會選擇 #3 – 通過您自己的前端伺服器傳遞文件,並以您的應用程序通常執行的方式進行身份驗證。假設您的正常安全性相當不錯,從安全形度來看,這是最佳選擇。
是的,這意味著在您的伺服器上使用更多的頻寬,以及更多的資源充當中間人——但您總是可以為此收取更多的費用。