SQL Server Int主键和Guid

时间:2015-11-11 16:21:51

标签: sql .net sql-server

我最近移动了公司,他们在SQL Server中做了一些我以前从未见过的事情。我习惯使用主键列作为int,在插入时递增,偶尔我看到guids的使用,但在这里他们使用两者,见下文。

PrimaryID | GUID | RestOfColumns

我无法理解为什么?在问这个问题时,他们告诉我这是针对SQL注入的另一层保护。在存储过程中,他们使用guid查找主键ID然后再使用id,我个人看不到这个好处?

我的问题是:

  • 在代码中公开主键是否存在安全风险?
  • 使用guid获取主键有什么好处吗?

修改

用法示例(伪代码):

  1. 我需要联系。
  2. 从QueryString中检索联系人Guid。
  3. 调用SQL Server存储过程以获取联系。
  4. 在存储过程中:根据guid在联系表中查找id。
  5. 使用id作为外键,在其他表中获取相关值。
  6. 返回数据。

3 个答案:

答案 0 :(得分:5)

如果有人查看了您网站的html源代码,他们可能会看到他们正在提交表单并传递他们的ID为“1003”。因此,从那里,他们可以构建一个表单,传递ID“1002”并查看其他人的数据。它不完全是“SQL注入”,它更像是参数猜测。

但如果他们看到他们的ID是一个GUID,它看起来像是随机字符,他们就会更难猜测系统中可能存在其他有效ID。

答案 1 :(得分:0)

主要好处是:我们已经有一堆使用PrimaryID的代码,包括将PrimaryID映射为主键列的ORM代码。我能看到保留PrimaryID的唯一原因是人类可读性。

另外,我应该告诉您,GUID并不总能保护您免受数据抓取。您很可能正在使用以可预测模式(顺序或其他方式)生成GUID的数据库。

答案 2 :(得分:0)

拥有int主键和单独Guid的主要原因是复制。复制要求您指定ROWGUIDCOL,其类型必须为uniqueidentifier

这样做是因为您可能在多个服务器上生成数据并在复制过程中将数据合并在一起。为此,您需要一个对该行唯一的ID,即使这些行是在两个没有通信的服务器上生成的。