SQL Server Int 主键和 Guid

Posted

技术标签:

【中文标题】SQL Server Int 主键和 Guid【英文标题】:SQL Server Int primary key and Guid 【发布时间】:2015-11-11 16:21:51 【问题描述】:

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

PrimaryID | GUID | RestOfColumns

我的脑袋转不过来,为什么?当问这个问题时,他们告诉我这是防止 SQL 注入的另一层保护。在存储过程中,他们使用 guid 来查找主键 ID,然后无论如何都使用 id,我个人看不到好处吗?

我的问题是:

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

编辑:

使用示例(伪代码):

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

【问题讨论】:

“针对sql注入的另一层保护”???严重地??听起来有些人不知道为什么要使用几个流行语来让它听起来超级酷。如果他们参数化他们的 sql,就没有 sql 注入的风险。当您通过 sql 或动态 sql 直接执行参数值时,就会发生这种情况。这一切对我来说似乎有点矫枉过正,但你的帖子中并不清楚实际的实现。 我同意@SeanLange 的观点,听起来像是一个阅读了几篇文章,将两个和两个放在一起,然后想出了五个的人。 向我提到的其他一些事情是使用 INT Ids 在 sql 中搜索更快,但在逻辑中公开 guid 更安全。所以“更安全”的 guid 用于在 sql 中获取“更快”的 id。这可能是我缺乏 sql 知识,但这似乎是正确的。我试图收集足够的信息,以便说服他们开始使用更标准化的做法。 【参考方案1】:

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

但如果他们看到他们的 ID 是一个 GUID,看起来就像随机字符,他们就很难猜出您的系统中可能还有哪些其他有效 ID。

【讨论】:

谢谢,这是有道理的,但是您能看出使用 guid 和 int id 有什么意义吗? 为了安全起见,关键是您使用前端的 GUID,然后使用 INT ID 作为连接其他表的 PK,因为 INT 上的连接执行速度比加入 GUID。 非常合理的解释,比其他人的判断性cmets更有帮助。【参考方案2】:

主要的好处是:我们已经有一堆使用 PrimaryID 的代码,包括将 PrimaryID 映射为主键列的 ORM 代码。我认为保留 PrimaryID 的唯一其他原因是为了便于阅读。

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于SQL Server Int 主键和 Guid的主要内容,如果未能解决你的问题,请参考以下文章

sql server 主键与外键约束无法创建

SQL Server 主键设计

SQL server :主键和外键

SQL入门经典 之键和约束

请问SQL server 中的主键和外键的作用

SQL入门经典之键和约束