2010-05-11 42 views
1

我試圖混淆所有離開服務器的標識符,即出現在URL和HTML輸出中的標識符。Rails應用程序中的模糊標識

我已經寫了一個簡單的Base62庫,它有方法編碼和解碼。定義或更好地覆蓋ActiveRecord的id方法以返回id的編碼版本並調整控制器以加載解碼後的資源給我期望的結果。這些id現在在url中被base62編碼,並且響應顯示正確的資源。

現在我開始注意到,通過has_many關係定義的子資源未加載。例如我有一個記錄叫Userhas_manyPost s。現在User.find(1).posts是空的,雖然有帖子user_id = 1。我的解釋是,ActiveRecord必須將user_idPost方法idUser(我已覆蓋)而不是與self[:id]進行比較。所以基本上這使我的方法無用。

我想要的是類似於在模型中定義obfuscates_id,其餘的將被照顧,即在適當的位置進行所有編碼/解碼並且防止服務器返回ID。

是否有任何寶石可用或有人提示如何實現這一目標?我敢打賭,我不是第一次嘗試這個。

+1

浪費時間浪費本來可以用於提高整體安全時間。還是有另一個混淆原因? – LukeN 2010-05-11 22:25:45

+2

ID混淆不是一個安全測量恕我直言。它只隱藏ID中包含的某些信息,例如網站上有多少註冊用戶或有多少帖子。用簡單的base62編碼版本替換它們並不能揭示這種信息。我不願意因此而失去太多時間,這就是爲什麼如果我可以簡單地在模型中調用'obfuscates_id'會很酷。 – fphilipe 2010-05-11 22:35:19

+0

重要的是網站上有多少用戶或帖子? – Earlz 2010-05-11 22:36:45

回答

3

你所描述的聽起來像是一個URL slug的專門應用程序。看看像acts_as_sluggable或friendly_id這樣的插件。也可以看看覆蓋用戶模型上的to_param方法。

也許從這裏開始:在混淆Best Permalinking for Rails

+0

覆蓋#to_param是要走的路。 – 2010-05-12 02:28:17

+0

謝謝@jdl,這看起來很有希望。有一點需要注意:您必須將實際的ActiveRecord對象傳遞給url助手以獲取編碼版本,例如'user_path(@user)'而不是'user_path(@ user.id)'。 – fphilipe 2010-05-12 08:26:13