我应该掩盖主键值吗?

Sco*_*ott 16 language-agnostic web-applications primary-key

我正在构建一个Web应用程序,其中前端是一个高度专业化的搜索引擎.搜索在主URL处理,当用户单击搜索结果以进行更详细的显示时,用户将被传递到子目录.这个切换是作为GET请求完成的,主键在查询字符串中传递.我似乎记得在某个地方读到向用户公开主键并不是一个好主意,所以我决定实现可逆加密.

我开始怀疑自己是不是只是偏执狂.可逆加密(base64)可能很容易被任何关心尝试的人破坏,使URL变得非常丑陋,并且也比其他人更长.我应该放弃加密并明确发送我的主键吗?

cle*_*tus 22

你在做什么基本上是模糊处理.可逆加密(并且base64实际上不算作加密)主键仍然是主键.

您所阅读的内容归结为:您通常不希望主键在系统外具有任何意义.这称为技术主键而不是自然主键.这就是为什么您可以使用患者ID的自动编号字段而不是SSN(称为自然主键).

技术主键通常比自然主键更受欢迎,因为看起来不变的东西会发生变化,这可能会导致问题.甚至国家也可以存在并且不复存在.

如果您确实拥有技术主键,那么您不希望通过赋予它们其他方面没有的含义来使它们成为事实上的自然主键.我认为将主键放在URL中是好的,但安全性是一个单独的主题.如果有人可以更改该URL并访问他们无法访问的内容,那么这是一个安全问题,需要通过身份验证和授权来处理.

有些人会争辩说,用户永远不应该看到它们.我认为你不需要那么远.


Joh*_*man 7

关于暴露你的主键的危险,你会想要阅读" 自动增量被认为是有害的 ",作者:Joshua Schachter.

包含标识符的网址会让您失望,原因有三个.

第一个是给定某个对象的URL,您可以找出围绕它创建的对象的URL.这会将数据库中的对象数量暴露给可能的竞争对手或您可能不想拥有此信息的其他人(正如盟军通过查看序列号猜测德国坦克生产水平所证明的那样.)

其次,在某些时候,一些混蛋会想到用for循环编写一个shell脚本并试图从你的系统中获取每个单独的对象; 这绝对没有乐趣.

最后,在用户的情况下,它允许人们获得某种社会等级.见证频繁劫持和/或黑客攻击高声望的低数字ICQ ID.