想到一个自增 id 但是同时防止遍历的办法

2015-11-12 10:56:13 +08:00
 est
比如会员, uid 从 1 开始,那么一些人就可以从 1 开始爬虫。。。

于是我在脑洞一些办法防止这个事。有的用uuid,甚至hash,感觉都不是很友好。在保持id自增的前提下,我想了一些办法:

第一个手段当然是限频率和屏蔽手段。。。

第二个手段,就是把自增 id 弄成稀疏的。 比如统统跳过 id 个位数为 7 的。。那么如果有人故意访问 uid=7, uid=17, uid=27 等等,就直接判定为爬虫,封锁之。

当然,判断个位数,这个很容易被发现规律猜到。

那么,有没有比较好的算法,让人猜不到这个 “间隙” id 的规律,但是服务器又非常容易判断为不可用 id 呢?
15574 次点击
所在节点    奇思妙想
85 条回复
typcn
2015-11-12 16:37:51 +08:00
@est 搜索引擎蜘蛛也会这样的。。
est
2015-11-12 16:39:14 +08:00
@iambic 这也是个好思路。
est
2015-11-12 16:40:03 +08:00
@typcn 增加一行 UA+IP 地址段判断,不拉黑就是了。
hooopo
2015-11-12 16:50:03 +08:00
@est 无规律的随机点就可以,加一个 hole 表...里面随机填一些 id 就好吧
est
2015-11-12 16:53:28 +08:00
@hooopo 感觉通过算法算出来的好好玩一点。。
jsq2627
2015-11-12 17:20:24 +08:00
UUID/GUID 当然是最好的。只不过长的比较丑,对用户不友好。不过还是可以避免,我们最近在做的一个系统,用户注册后就必须得输入一个五位代码做 URL 定位部分。
FrankFang128
2015-11-12 17:32:09 +08:00
ban 有什么用,很快就发现你的规律了。
haython
2015-11-12 17:35:41 +08:00
用进制转换啊, 10 进制转换成 36 进制, 10 数字加 26 个字母,把顺序打乱
xierch
2015-11-12 18:23:39 +08:00
不如 ID 还是按顺序自增,但是提供给用户的时候,在末尾加一位数用作校验?
效果应该类似于,每两个 ID 之间平均间隔 10 个黑洞
校验值可以用任意算法加密 ID ,然后 mod 10 得到..

推广一下,可以用 id * N + (encrypt(id) % N) 得到带校验码的 id_v
服务器收到 id_v 以后,用 id_v / N 得到原 ID ,
然后用 id_v % N == encrypt(id, key) % N 判断是否正确。
( N >= 2 ,越大掺的洞越多(
dallaslu
2015-11-12 20:06:53 +08:00
1. 使用自增 ID ,记为 A ;
2. 生成 UUID ,去掉前面的 0 ,再取前 X 位按 16 进制转为 10 进制的值,记为 B ;
3. 计算 X 位 16 进制数字的 10 进制值的数字个数(如 4 位 16 进制数字 FFFF 10 进制值为 65535 ,数字个数为 5 ),记为 C ;
4. 在 B 的前面补 0 ,以使长度等于 C ,将其记为 D ;
5. 把 A 和 D 拼接起来,用做外显 ID 。

比如设 X 为 4 , A 为 235554 , UUID 为 3FE4C8B33C ...,则:

B = 0x3FE4 = 16356 ;
C = 5 ;
D = 16356 ;
ID = 23555416356

遇到 404 就可以判为爬虫了。话又说回来,自增 ID 后面拼上定长的随机数不就好了么!
dallaslu
2015-11-12 20:10:40 +08:00
当然了,如果还有校验的需求,可以用 md5(id+salt) 来代替 UUID ,参与 12345 运算……
hansnow
2015-11-12 20:17:47 +08:00
@est 其实我想说,你是唯一一个我在 D 版和 v2 同时看到的活跃 id
ctftemp
2015-11-12 20:17:51 +08:00
id 加盐 hash 一下,拿这个 hash 值作为判断依据就比较难预测了吧?
pepsin
2015-11-12 20:20:48 +08:00
@hansnow 你可能看漏我了
hansnow
2015-11-12 20:22:19 +08:00
@pepsin 哈哈哈,看你头像就想起来了
Hipponensis
2015-11-12 20:59:42 +08:00
LS 许多思路学习了,但总觉得防遍历有点舍本逐末,不如 ID 还是按顺序自增,然后下陷阱,某些 id 对应的页面用户无法访问,让爬虫进去,然后封禁对应 ip 。以上爬虫新手瞎想的。
varrily
2015-11-12 23:47:16 +08:00
我在用 base58(uuid) 长度 22 位左右。比直接 uuid 短不少。
msg7086
2015-11-12 23:48:51 +08:00
@haython http://ra.gg/!iMD4o 以前还做过类似的东西其实。

@xierch 其实信用卡、身份证,都是基于这个机制。
abscon
2015-11-13 08:41:50 +08:00
@twor2 我就敲网址。有时候这是最方便的
holyghost
2015-11-13 09:26:47 +08:00
有开源的 hashids 不用。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/235554

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX