2015-11-11 131 views
1

我最近移動了公司,他們在SQL Server中做了一些我從未見過的事情。我習慣於使用主鍵列作爲插入時遞增的int,偶爾我見過使用GUID,但在這裏它們使用兩者,見下文。SQL Server Int主鍵和Guid

PrimaryID | GUID | RestOfColumns 

我不明白爲什麼?當問這個問題時,他們告訴我這是針對SQL注入的另一層保護。在存儲過程中,他們使用guid來查找主鍵ID,然後使用該ID,但我個人無法看到其好處?

我的問題是:

  • 是否有任何安全隱患暴露在代碼中的主鍵?
  • 使用guid獲取主鍵有什麼好處嗎?

編輯:

使用(僞碼)的實例:

  1. 我需要一個接觸。
  2. 從QueryString中檢索聯繫人Guid。
  3. 調用SQL Server存儲過程來獲取聯繫人。
  4. 在存儲過程中:根據guid找到聯繫人表中的id。
  5. 使用id在其他表中使用id作爲外鍵獲取相關值。
  6. 返回數據。
+3

「防止SQL注入的另一層保護」???認真?聽起來像某個人不知道爲什麼使用一對流行語來做這件事,使它聽起來非常酷。如果他們參數化他們的sql沒有sql注入的風險。當您直接通過sql或動態sql執行參數值時會發生這種情況。這一切似乎對我來說有點矯枉過正,但實際的實施並不清楚你的帖子。 –

+2

我同意@SeanLange,聽起來像讀了幾篇文章,把兩個和兩個放在一起,並提出了五個。 –

+0

Somehting其他人向我提到的是,使用INT ID在SQL中搜索更快,但它更安全地揭示邏輯中的GUID。所以「安全」的guid被用來在sql中獲得「更快」的id。這可能是我缺乏sql知識,但這似乎是對的。我試圖收集足夠的信息,以便說服他們開始使用更加標準化的做法。 – Srb1313711

回答

5

如果有人查看您網站的html源代碼,他們可能會看到他們正在提交表單並傳遞他們的ID爲「1003」。因此,從那裏開始,他們可以構建一個傳遞「1002」ID的表單並查看其他人的數據。這不完全是「SQL注入」,它更像是參數猜測。

但是,如果他們看到他們的ID是一個GUID,它看起來像隨機字符,他們會更難猜測系統中可能有哪些其他有效的ID。

+0

謝謝,這是有道理的,但你能看到使用guid以及int id的任何一點嗎? – Srb1313711

+1

那麼重點就是你使用前端的GUID來確保安全性,然後使用INT ID作爲與其他表的連接的PK ID,因爲INT上的連接將比GUID上的連接執行得更快。 –

+0

這很有道理,謝謝! – Srb1313711

0

主要好處是:我們已經有一堆使用PrimaryID的代碼,包括將PrimaryID作爲主鍵列的ORM代碼。我能看到保持PrimaryID的唯一原因是爲了人類的可讀性。

此外,我應該讓你知道,GUID並不總是保護你免受數據欺騙。你很可能會使用一個以可預測的模式生成GUID的數據庫(順序或其他)。

0

具有int主鍵和單獨的Guid的主要原因是用於複製。複製要求您指定一個ROWGUIDCOL,它必須是uniqueidentifier

這樣做是因爲您可能正在多臺服務器上生成數據並在複製過程中將數據合併在一起。要做到這一點,即使在兩個沒有通信的服務器上生成行,您也需要一個對該行唯一的ID。