2009-11-17 52 views
2

大多數使用自動增量主鍵的站點都會在URL中公開顯示它。一般總是一個好主意總是哈希唯一標識符的URL?

example.org/?id=5

這使得它很容易讓任何人都可以蜘蛛網站,並通過簡單地增加id的值收集所有的信息。我可以理解,在某些情況下,如果權限/身份驗證設置不正確,任何人都可以通過簡單猜測身份識別碼來查看任何內容,但在某些情況下這是不好的事情,但它是否是好的的事?

example.org/?id=e4da3b7fbbce2345d7772b0674a318d5

是否有過在那裏散列ID以防止爬行形勢不好的做法(除了丟失需要設置此功能的時間)?或者這是一個有爭議的話題,因爲通過在網絡上放置東西來接受被盜/被開採的風險?

回答

4

通常對於網站,您將嘗試,以便他們輕鬆抓取並獲取所有信息的訪問權限,以便您可以獲得良好的搜索排名並吸引訪問您網站的流量。良好的Web開發人員在設計HTML時考慮到了搜索引擎,並且通常還提供RSS源和站點地圖等內容,以便更容易地抓取內容。因此,如果您嘗試通過不使用順序標識符來使爬行更加困難,那麼(a)您不會讓它變得更加困難,因爲爬蟲通過跟蹤鏈接工作,而不是通過猜測URL,以及(b)您嘗試讓事情變得更加困難,以至於你也花時間試圖變得更容易,這是沒有意義的。

如果您需要安全,請使用實際安全。使用對主體的檢查來授權或拒絕對資源的訪問。混淆網址完全沒有安全性。

所以我沒有看到使用數字標識符或任何值試圖混淆它們的問題。

2

我認爲可公開訪問的id的散列並不是一件壞事,但是在某些情況下顯示順序id的意思是一件壞事。更好的是,爲所有ID使用GUID/UUID。你甚至可以在很多技術中使用順序GUIDS,所以速度更快(插入階段)(雖然在分佈式環境中並不如此)

3

在ID上使用像MD5或SHA這樣的散列並不是一個好主意:

  • 總是有碰撞的可能性。也就是說,兩個不同的ID散列到相同的值。
  • 你打算怎樣把它擺回實際的ID?

如果您設置爲避免遞增ID,則更好的方法是在創建ID時使用GUID或隨機值。也就是說,如果您的應用程序安全性依賴於不猜測ID的人,那麼在系統的其他地方會顯示一些缺陷。我的建議:堅持簡單易用的自動遞增ID並應用一些適當的訪問控制。

+0

是的,使用MD5作爲整數ID與使用整數ID相同,因爲這兩者之間有一個很好的一對一的對應關係。一個足夠積極的用戶可以拿出一個彩虹表(http:// www。freerainbowtables.com/en/tables/md5/),並使用MD5s而不是整數破解你的網址。 – Seth 2009-11-17 22:47:18

1

我的意見是,如果網絡上有東西,並且沒有經過授權就提供服務,它的目的是要公開訪問。積極嘗試讓訪問變得更加困難似乎違反了直覺。

0

我的一般規則是使用GUID,如果我顯示的東西必須顯示在URL中,並且還需要憑據訪問或對特定用戶(例如訂單ID)是唯一的。 http://site.com/orders?id=e4da3b7fbbce2345d7772b0674a318d5

這樣,另一個用戶將無法通過黑客入侵下一個訂單「偷看」。他們可能會被拒絕接觸別人的訂單,但向他們投擲數十億個字母和數字是一種非常明確的方式,可以說「不要混淆這個」。

如果我顯示的是公開的內容,而不是綁定到特定的用戶,那麼我可以使用整數鍵。例如,爲了顯示圖片,您可能希望允許用戶破解網址以查看下一張圖片。

http://example.org/pictures?id=4http://example.org/pictures?id=5

(其實我不會做既可以作爲一個簡單的GET參數,我會使用mod_rewrite(或東西),使可讀的URL喜歡的東西http://example.org/pictures/4 - >/pictures.php?picture_id=4等)

+1

IMO,如果另一個用戶可以通過正確的URL「窺視」另一個訂單,即使是一個模糊的URL,那麼該軟件也有一個**主要**安全漏洞。 – 2009-11-18 00:26:37

0

散列整數是安全性較差的實現,因此如果這是目標,那麼真正的GUID甚至是「順序」GUID(無論是通過NEWSEQUENTIALID()還是COMB算法)都好得多。

無論哪種方式,再也沒有人會輸入網址了,所以我沒有太多的理由擔心長度的差異。

1

通常,蜘蛛網站是一件好事。如果您希望儘可能提供您的信息,您希望Google等網站收集您網站上的數據,以便其他人可以找到它。

如果您不想讓人們通讀您的網站,請使用身份驗證,並拒絕訪問無權訪問的人。

隨機的URL只給人一種安全的印象,沒有給出現實。如果您將帳戶信息(隱藏)放入網址中,則每個人都可以訪問該網站蜘蛛的帳戶。

2

當您不希望URL可以穿越時,散列或隨機化標識符或其他URL組件可能是一種好的做法。這不是安全性,但會阻止抓取工具使用(或濫用)您的服務器資源,並可幫助您確定何時發生。

通常,您不希望公開應用程序狀態,例如未來將分配哪些ID,因爲它可能允許攻擊者以您未預先考慮的方式使用預測。例如,BIND的順序交易ID是security flaw

如果您確實想要鼓勵抓取或其他遍歷,更嚴格的方法是提供鏈接,而不是提供可能在未來發生變化的實現細節。

使用順序整數作爲ID可以使許多事情在您的端更便宜,並且可能是一個合理的折衷。