4

我正在开发一个允许版主编辑用户信息的应用程序。所以,目前,我有类似的 URL

http://xxx.xxx/user/1/edit
http://xxx.xxx/user/2/edit

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

请注意:

我正在验证每个请求以检查版主是否有权编辑该用户

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

我可以想到一种替代方法,即为带有 25 个字符键的用户表设置一个单独的列,并使用 URL 中的键并使用这些键查询数据库

但,

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

5 回答 5

4

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

于 2014-04-22T13:34:35.597 回答
2

基本问题是公开主键是否安全。我会说在大多数情况下它是安全的,而且我相信 Stackoverflow 也是这样做的:

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

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

无论如何,在您希望普通用户通过在 URL 中键入 1、2、3 等来避免浏览所有条目的情况下,隐藏 PK 可能很有用,在这种情况下,隐藏 PK 之类的东西535672571d2b4很有用。

于 2014-04-22T13:40:48.157 回答
1

如果您真的不确定,您也可以使用带有不错(大)固定值的 XOR。这样你就不会暴露你的身份证。当使用异或字段再次应用相同的“秘密数字”时,您将获得原始值。

$YOUR_ID xor $THE_SECRET_NUMBER = $OUTPUTTED_VALUE

$PUTPUTTED_VALUE xor $THE_SECRET_NUMBER = $YOUR_ID

于 2014-04-22T14:31:24.857 回答
0

快速回答否

长答案

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

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

但这将是默默无闻的安全。所以更好地防止 SQL 注入并验证人们是否可以访问正确的操作

于 2014-04-22T13:35:42.157 回答
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>
)
于 2014-04-22T13:41:19.113 回答