对 table 使用随机 ID 而不是 PRIMARY KEY AUTOINCREMENT,以避免客户端知道记录数
Use a random-looking ID for a table instead of PRIMARY KEY AUTOINCREMENT, to avoid the client knowing the number of records
我有一个 Sqlite3 table,它将有数千到数百万条记录。
对于每个网站用户,都会创建一个 ID 并将其保存在数据库中。这个 ID 被发送到客户端,然后客户端将一些数据连同这个 ID 一起发送回服务器(使用 XHRHttpRequest)。
如果我使用 CREATE TABLE mytable (id INTEGER PRIMARY KEY AUTOINCREMENT, ...)
那么客户端就能在HTML/JS中看到这个ID。 问题:客户端可以看到当前的ID,知道已经处理了多少条记录,猜测之前用户的ID等等这个必须要避免。
如果我使用 CREATE TABLE mytable (id INTEGER PRIMARY KEY AUTOINCREMENT, ...)
,我也可以将 h = mycrypt(id, salt)
发送给客户端,而不是 id
。但是,当数据从客户端返回时(包括h
),我们要做:
UPDATE FROM mytable ... WHERE mycrypt(id, salt) = h;
最后一个查询意味着我们必须对每一行应用 mycrypt
(即全扫描!)以找到正确的行。如果 table 有大量行,这将 非常耗时 。当然我们可以在 mycrypt(id, salt)
上创建一个索引,但这意味着有 2 个索引(一个用于 id
,一个用于加密的 id
),这不是最优的:我们最终得到 2索引,当肯定可能只有 1 个索引时。
或者,我们可以创建一个外观随机的 ID 作为 PRIMARY KEY
吗?你会怎么做?它没有排序的事实肯定会影响性能,有没有一种众所周知的方法来处理这个问题?
更一般地说,如何处理给客户端 ID 的问题,最好是不增加 1、2、3、4、5,...,但仍然有快速查找服务器端?
我想如果你能加密一个 id 那么你就可以解密到...
UPDATE FROM mytable ... WHERE id = decrypt(h, salt);
但最好解决随机id。
我在我的应用程序中创建了一个 UUID 并发送到数据库。那么ID列不是AUTOINCREMENT.
许多语言都支持 UUID。 (C,Java,PHP)
如果你有更多的appserver或dbserver,UUID是唯一的。
我有一个 Sqlite3 table,它将有数千到数百万条记录。
对于每个网站用户,都会创建一个 ID 并将其保存在数据库中。这个 ID 被发送到客户端,然后客户端将一些数据连同这个 ID 一起发送回服务器(使用 XHRHttpRequest)。
如果我使用
CREATE TABLE mytable (id INTEGER PRIMARY KEY AUTOINCREMENT, ...)
那么客户端就能在HTML/JS中看到这个ID。 问题:客户端可以看到当前的ID,知道已经处理了多少条记录,猜测之前用户的ID等等这个必须要避免。如果我使用
CREATE TABLE mytable (id INTEGER PRIMARY KEY AUTOINCREMENT, ...)
,我也可以将h = mycrypt(id, salt)
发送给客户端,而不是id
。但是,当数据从客户端返回时(包括h
),我们要做:UPDATE FROM mytable ... WHERE mycrypt(id, salt) = h;
最后一个查询意味着我们必须对每一行应用
mycrypt
(即全扫描!)以找到正确的行。如果 table 有大量行,这将 非常耗时 。当然我们可以在mycrypt(id, salt)
上创建一个索引,但这意味着有 2 个索引(一个用于id
,一个用于加密的id
),这不是最优的:我们最终得到 2索引,当肯定可能只有 1 个索引时。或者,我们可以创建一个外观随机的 ID 作为
PRIMARY KEY
吗?你会怎么做?它没有排序的事实肯定会影响性能,有没有一种众所周知的方法来处理这个问题?
更一般地说,如何处理给客户端 ID 的问题,最好是不增加 1、2、3、4、5,...,但仍然有快速查找服务器端?
我想如果你能加密一个 id 那么你就可以解密到...
UPDATE FROM mytable ... WHERE id = decrypt(h, salt);
但最好解决随机id。
我在我的应用程序中创建了一个 UUID 并发送到数据库。那么ID列不是AUTOINCREMENT.
许多语言都支持 UUID。 (C,Java,PHP) 如果你有更多的appserver或dbserver,UUID是唯一的。