18

我經常遇到通過類似選擇框的形式暴露內部數據庫主鍵的Web應用程序。偶爾,我會看到JavaScript匹配的邏輯與切換邏輯的int或guid魔術值。避免暴露Web應用程序源中的主鍵?

是避免泄露Web應用程序中行的所有內部標識符以防止外部人員瞭解您的系統太多並可能使用它來利用您的系統的最佳實踐。如果是的話,解決這個問題的最好方法是什麼?

是否應該向Web應用程序公開一些可以轉換回主鍵的其他值?

感謝

編輯

在一個完美的世界,你的應用是100%安全的,所以如果你掩蓋的東西它不會有問題。顯然情況並非如此,所以我們應該謹慎一些,不要暴露這些信息?

有人指出,Stackoverflow可能暴露在Url中的一個關鍵,這可能是好的。但是,企業應用程序的注意事項是不同的

回答

24

我不同意的立場,揭露主鍵是一個問題。如果你讓它們對用戶可見,那麼它會成爲一個問題,因爲它們在系統之外被賦予了意義,這通常是你想要避免的。

但是要使用ID作爲組合框列表項的值?去說吧,我說。翻譯中間價值和翻譯的重點是什麼?您可能沒有使用的唯一密鑰。這樣的翻譯引入了更多的潛在錯誤。

只是不要忽視安全。

如果說你目前有6個項目(編號1〜6)用戶,永遠不要假設你只得到這些值從用戶回來。有人可以嘗試通過發回ID 7來破壞安全性,因此您仍然必須驗證是否允許您返回。

但避免了完全?沒門。沒必要。

作爲對另一個答案的評論說,看看這裏的網址。這包括無疑是SO數據庫中問題的主要關鍵。公開密鑰用於技術用途是完全正確的。

另外,如果你使用一些替代值來代替,這並不一定更安全。

3

是的所有問題。我同意你的觀點,你應該「向網頁應用公開一些其他價值,可以將其翻譯回主鍵

否則,你可以打開自己的潛在問題。

編輯

關於該評論「沒有理由採取加罰命中爲瑣碎的鑰匙。看在你瀏覽器的URL現在,我敢打賭,你看到一個關鍵!」。

我明白你在說什麼,是的,我確實看到了SO URL中的關鍵字,並同意它可能引用了數據庫PK。我承認在這樣的情況下,如果沒有更好的替代方案,那很可能。

我還是更喜歡揭示除PK之外的東西 - 具有語義價值的東西。問題的標題也在URL中,但由於這很難被驗證爲唯一的(或者在用戶之間口頭傳遞),所以它不能可靠地使用它自己。

然而,當查看「標籤」URL(即https://stackoverflow.com/questions/tagged/java+j2ee)時,PK沒有公開,並且使用標籤名稱。就我個人而言,我更喜歡這種方法,並會爲此而努力。

我也想補充一點,PK指向的數據有時會隨着時間而改變。我已經開發了一個系統,在該系統中,一個表格中充滿了離線過程中的信息 - 即每月統計數據,其中數據庫表格內容在月末下降並且被新數據重新填充。

如果以不同的順序將數據添加到數據庫中,特定數據點的PK將會發生變化,並且從該數據上一個月保存的任何書籤現在都會指向一組不同的數據。

這是暴露PK會「破壞」與應用程序的安全性無關的應用程序的一個實例。生成的密鑰並非如此。

+2

這不是一個絕對的,沒有理由採取加罰命中的瑣碎的鑰匙。立即查看瀏覽器的網址,我敢打賭你看到了一把鑰匙! – 2009-04-30 13:10:48

+1

我沒有看到你表現出任何的安全流動或者你爲什麼會喜歡一個代理鍵。此外,你給的例子只是糟糕的設計。 – andho 2012-12-17 04:59:16

3

是的,暴露密鑰是可以用作攻擊的信息。特別是如果它們是可預測的。

如果您認爲信息很敏感,請使用不同的鍵/列。

例如避免顯示你有多用戶有考慮:

site.com/user/123 VS site.com/user/username

0

與往常一樣, 「這取決於」。如果某人可以通過了解每個(小時/每月/每月)執行多少次交易來獲得價值(說),並且您將交易ID顯示爲單調遞增的數字,那麼這是一個風險。

正如其他人雖然說,對於值的下拉列表中,一般沒有問題。

0

揭露以外的數值時的主鍵將無法避免你檢查你的安全的負擔。事實上,如果您的安全性存在漏洞,「惡意」用戶仍然可以通過更改url中的值來訪問他們不打算訪問的對象。他們可能沒有使用哪些價值的線索,但隨機挑選價值,他們可能會很幸運。

如果你想以這種方式提高安全性,你將不得不在url中使用大的隨機字符串(使猜測困難),而不是id,並使用一個間接表匹配隨機值與良好的id在背景。

我認爲這是不值得大部分時間的麻煩。

這就是說,你要「通過隱藏的安全」它是非常有用的情況下,例如像當你暴露修改用戶密碼頁面,無需登錄(用戶失去了他們的密碼)。在這種情況下,您還應該將限制有效日期與您的密鑰相關聯。

0

主鍵是不一樣的東西作爲一個代理鍵或內部密鑰,雖然有一些重疊。內部密鑰的相反是一個自然的關鍵。有很多時候,一個自然鍵被用作主鍵。一般來說,除非我們正在處理隱私問題,否則沒有理由隱藏自然鍵。

你真正的問題是,我認爲,有關內部鍵是否應該暴露給用戶。答案是,「這取決於」。對於大多數用戶羣體而言,公開內部密鑰將導致密鑰被用作自然密鑰。這可以,而且通常確實導致了一些混亂,當內部鍵和錶行的對象之間的一到一個映射分解。

此擊穿只能發生作爲數據管理不善的結果。然而,大多數情況下,您必須計劃在現實世界中發生的一些數據錯誤管理。你不會計劃一個供水系統,當水管不當時就會發生故障。每次發生數據錯誤時,您都不打算劃分信息系統。儘管如此,目前大多數數據庫設計人員都爲軟件供應商工作,並沒有看到他們的產品用戶由於數據管理不當而導致的問題。

相關問題