我应该在应用程序前端模糊数据库主键(id' s)

时间:2014-04-22 13:29:58

标签: php sql security-by-obscurity

我正在开发一个允许主持人编辑用户信息的应用程序。 所以,目前,我有像

这样的网址
http://xxx.xxx/user/1/edit
http://xxx.xxx/user/2/edit

我有点担心,因为我直接从数据库中公开users表主键(id)。 我只是从URL中获取id(例如:URL上面的1和2),使用ID查询数据库并获取用户信息(当然,我清理输入,即URL中的ID)。

请注意:

我正在验证每个请求,以检查主持人是否有权修改该用户

这就是我正在做的事情。这样安全吗?如果没有,我该怎么做呢?

我可以想到一个替代方案,即具有25个字符键的用户表的单独列,并使用URL和查询数据库中的键与这些键

但是,

  • 它有什么区别? (因为密钥现在暴露)
  • 按主键查询产生的结果比其他列
  • 更快

5 个答案:

答案 0 :(得分:3)

这是安全的(并且似乎是最好的方法),只要管理权限的验证是正确的并且您已预防SQL注入。你提到的这两个我都说你很好。

答案 1 :(得分:1)

基本问题是暴露主键是否安全。我会说在大多数情况下它是安全的,我相信Stackoverflow正以同样的方式做到这一点:

http://stackoverflow.com/users/1/
http://stackoverflow.com/users/2/
http://stackoverflow.com/users/3/

如果你检查member for你可以看到时间正在减少,那么这个数字也可能是PK。

无论如何,如果你希望普通用户只是通过输入1,2,3等URL来避免遍历所有条目,那么模糊PK会非常有用,在这种情况下,为535672571d2b4之类的东西模糊PK很有用。

答案 2 :(得分:0)

快速回答否

长答案

您有一个主键可以识别某个主键,这是唯一的。如果您添加一个唯一的密钥以防止人们知道它,您就会知道他们知道另一个密钥。 哪个仍然需要是唯一的并且有一个索引(用于快速搜索),听起来很像主键。

如果这是一个很好的网址,那么你可以使用用户名或类似的东西。

但默默无闻是安全的。因此,beter会阻止SQL注入并验证人们可以访问正确的操作

答案 3 :(得分:0)

如果您有简单的自动增量ID,您将向全世界公开您的数据。它不是sequre(例如,用于强制表中的所有可用数据)。但是,您可以不按顺序生成数据库实体的ID,而是以伪随机方式生成。例如。在PostgreSQL中:

CREATE TABLE t1 (
    id bigint NOT NULL DEFAULT (((nextval('id_seq'::regclass) * 678223072849::bigint) 
    % (1000000000)::bigint) + 460999999999::bigint),
    ...
    <other fileds here>
)

答案 4 :(得分:0)

如果你真的不确定,你也可以使用具有良好(大)固定值的XOR。这样你就不会暴露你的id。当应用相同的#34;密码&#34;再次使用xor&#39; ed字段,您将获得原始值。

$ YOUR_ID xor $ THE_SECRET_NUMBER = $ OUTPUTTED_VALUE

$ PUTPUTTED_VALUE xor $ THE_SECRET_NUMBER = $ YOUR_ID