我正在开发一个允许主持人编辑用户信息的应用程序。 所以,目前,我有像
这样的网址http://xxx.xxx/user/1/edit
http://xxx.xxx/user/2/edit
我有点担心,因为我直接从数据库中公开users表主键(id)。 我只是从URL中获取id(例如:URL上面的1和2),使用ID查询数据库并获取用户信息(当然,我清理输入,即URL中的ID)。
请注意:
我正在验证每个请求,以检查主持人是否有权修改该用户
这就是我正在做的事情。这样安全吗?如果没有,我该怎么做呢?
我可以想到一个替代方案,即具有25个字符键的用户表的单独列,并使用URL和查询数据库中的键与这些键
但是,
答案 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