1

我在选择框中(或 html 代码中的任何其他内容)中读取的值不应该是数据库表的主键。例如:

<select>
       <option value="1">Value 1</option>
       <option value="2">Value 2</option>
</select>

在数据库中有以这些值作为主键(1、2、3、....)的查找表。因此,我存储在引用此查找表的表中的选择框中的数据是一个数字,例如 1、2、3....(作为选项字段的值)。由于安全原因,我最好不要在 html 中使用相同的值和作为密钥,但那有什么问题呢?我不明白为什么这应该是安全原因?

4

4 回答 4

4

听起来像security-through-obscurity,也就是对我来说根本没有安全性。

数据库中一个好的主键纯粹是为了系统的唯一性,不应该与数据的含义相关。如果主键数据相关(比如人们的社会安全号码,诸如此类的东西),那么您在公开密钥时就会遇到安全问题,因为它们会公开可能被恶意使用的信息。在这种情况下,虽然您可能会争辩说,从技术角度来看,最好的方法可能是更改应用程序以使用那些有意义的键停止它,但将键映射到其他一些无意义的键来克服它可能是一种更可口的方法问题。

另一个想到的情况是,暴露密钥可能会被解释为安全问题,即应用程序/数据层中的可写数据的身份验证和授权不充分,从而允许了解这些密钥的人干扰数据。应用。同样,保护系统是更好的方法。

除了安全性之外,如果密钥确实识别正在与之交互的数据并且您的应用程序在生成页面时正在查找密钥,我想不出一个特定的问题。

于 2010-10-24T21:28:14.013 回答
1

我会担心如何从 URL 处理信息。如果我使用 value="does_this_break_the_code" 或 value="can_I_read_secret_info" 发布内容会发生什么

于 2010-10-24T21:47:50.380 回答
1

在 URL 或 HTML 或应用程序代码中使用代理键时要小心谨慎。一般来说,我不会对钥匙说同样的话。

代理键不应该具有业务意义或在应用程序代码或外部流程中具有依赖性。这通常是一个重要的考虑因素,例如,如果由于数据库设计的演变或数据集被合并而需要更改键值。通过在代码或 URL 中使用代理键作为“幻数”,您可能会破坏使代理键有用的东西。此外,代理键对用户(也可能是开发人员)来说不太方便,因为这些值对他们来说毫无意义,因此比使用自然键更不可读。

我建议您在 URL 和持久代码中使用自然键。将代理键保存在数据库内部,这是它们应该在的地方。

于 2010-10-24T22:05:28.757 回答
0

主键应用作数据库中每个项目的唯一标识符,它可能不是部件号或与实际项目相关的任何内容。一般来说,PK 没有任何意义,在语义世界中,一切都应该有意义。如果有更好的唯一标识符,请务必使用它,因为您的 PK 除了对您的数据库没有任何帮助。

假设您有一个汽车数据库,所有汽车都有一个称为 VIN(车辆识别号)的唯一标识符,VIN 中编码了有关每辆特定汽车的一堆信息,一直到制造它的工厂。VIN 仅识别一辆特定的汽车。物品上的 PK 可以是任何东西,汽车从数据库中删除,现在 PK 不存在,但 VIN 仍然在某个地方。这是一个比 PK 更好的唯一 ID,所以这可能应该显示给用户。

于 2010-10-24T21:28:33.880 回答