2011-10-09 73 views
6

當你在一個社交網站如Twitter個人資料圖片,它們存儲的圖像文件,如:爲什麼隨機存儲雲存儲/ CDN的文件名?

http://a1.twimg.com/profile_images/1082228637/a-smile_twitter_100.jpg 

,甚至有地方約會路徑類似20110912.唯一直接的好處,我能想到的阻止bot以線性方式通過並下載存儲中的所有文件。我錯過了其他好處嗎?什麼是最好的方法去隨機化它?

我正在使用Amazon S3,因此我將有一個子域服務於我的所有靜態內容。我的計劃是在我的數據庫中存儲一個整數ID,然後將該URL與該ID進行連接以形成位置。

回答

11

我在公共URL中使用密碼加密標識符的一個原因是,企業的增長速度並不總是公開的。

如果可以簡單地通過創建新用戶帳戶或上傳圖像來推導當前的id,那麼外部人員可以通過定期這樣計算增長率(或上限)並查看有多少個ID在經過的時間內使用。

無論是停滯不前還是呈指數級增長,我希望能夠控制這些信息的發佈,而不是讓競爭對手或業務分析師自己推斷出來。

這是一個離線的例子是發票和支票號碼。如果您定期收到公司的付款或付款,那麼您可以看到他們在此期間寫了多少發票或支票。

下面是使用基於鰹雙向加密CPAN(Perl的)模塊,我認爲,攪亂32位的ID:

http://metacpan.org/pod/Crypt::Skip32

這是寫在Skip32算法的直接翻譯下用格雷格玫瑰:

http://www.qualcomm.com.au/PublicationsDocs/skip32.c

此方法的使用將每個32位id映射到一個(有效隨機)對應的32位數字,該數字可以反轉回原始ID。您不必在數據庫中另存任何內容。

我將加密的id轉換爲8位十六進制數字以顯示在URL中。

一旦您的ids接近42.9億(32位),您需要計劃擴展URL結構以支持更多,但我希望儘可能縮短URL。

+0

我喜歡這種思路。我將不得不重新考慮我的id生成策略。 – Adam

2

它主要防止名稱衝突。例如,不止一個人可能會上傳「IMG_0001.JPG」。您還可以避免限制一個目錄中的文件數量,並且可以在多臺服務器上分割圖像 - 無論如何,像Twitter或Facebook這樣的大型網站都無法將所有照片存儲在一臺服務器上,無論它多大。

+0

我明白你的意思,但Twitter使用Amazon S3,因此他們不必擔心服務器或目錄的概念。他們可以在一個目錄中存儲萬億個對象(或者它們的數量),而且不用擔心。就我而言,我在MySQL中使用自動遞增整數列作爲S3上的相應文件名,因此命名衝突不應該成爲問題。那麼你認爲有一個好的方法可以防止殭屍程序系統地下載你的所有文件嗎? – Adam

+0

他們肯定地獄不得不擔心,如果他們想要列出目錄中的文件尋找特定的文件。 – ceejayoz

+0

他們必須在其他地方存儲關於文件位置的元數據(數據庫,JSON文檔等)。我知道Twitter使用Amazon S3的一個事實,如果他們真的想,他們可以將所有圖片存儲在a1.twimg.com/*下。亞馬遜的雲處理硬件的程度很高,因此您不必在目錄方面進行思考。由於我特意詢問S3,在這種情況下分片和集羣不是問題。 – Adam

4

更改URL是使過時資產無效的安全方法。

如果您想允許用戶存儲私人圖像,這也是一種必要。將資產存儲在CDN上後,使用用戶帳戶名稱/ ID /路徑的可抵扣路徑將使隱私設置無效。