2015-11-11 89 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。