想到一个自增 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 呢?
14711 次点击
所在节点    奇思妙想
85 条回复
pubby
2015-11-12 11:07:29 +08:00
偶尔我用 /user/{uid}-{md5(uid+key)} 的形式防止遍历
est
2015-11-12 11:08:04 +08:00
@pubby 这个也太复杂了。。。 id 太长。。
wy315700
2015-11-12 11:08:43 +08:00
short_uuid
undeflife
2015-11-12 11:12:31 +08:00
不需要算法 id 随便什么规律都好 没规律也行
fail2ban 解析 access.log 多次符合规则的 404 ban 掉就行了
pubby
2015-11-12 11:14:51 +08:00
@est 嗯,所以偶尔用用。
ts
2015-11-12 11:16:11 +08:00
@est 大神你还经常在哪些站里出没或者潜水 除了 v2
est
2015-11-12 11:18:38 +08:00
@undeflife 这个有一个问题就是别人可以新注册一个用户,看 uid 可以大致判断出你总用户数是多少。。。
@wy315700 也可行。但是无序了。 id 自增感觉要好点。。
xujif
2015-11-12 11:18:43 +08:00
弄几个魔术 id ,访问就 ban
cyr1l
2015-11-12 11:18:59 +08:00
比如判断是否是质数或者是否能被某个质数(比如 17 ) 整除?
akira
2015-11-12 11:19:18 +08:00
自增的 id 只对内部使用,对外是一个 uuid 或者和 id 无表面关系的字符串
lanlanlan
2015-11-12 11:21:13 +08:00
只要爬虫 IP 资源够 都是浮云嘛→_→
est
2015-11-12 11:21:25 +08:00
@wy315700 而且如果 mysql 里用的话,还有可能冲突。。虽然很小概率。但是为了防止冲突还得加个唯一索引。这是要让人纠结死。。。而如果自增的话,直接根据上一个 id ,按照某一个算法,跳过一些 id ,就可以得到下一个 id 了。。。现在就是在想有没有这个比较好的算法。不容易猜出来,服务器计算和判断速度也比较快的。
est
2015-11-12 11:24:22 +08:00
@lanlanlan 如果加上运营商判断, ip 没那么好找哦。比如只允许 ADSL 的 IP 段访问,代理 ip 绝大多数是机房 ip 段。很容易判断出来。我见过很多国外论坛都只允许 comcast verizon at&t 之类的民用宽带 ip 访问。我换了 n 个代理,但是因为出口都是机房,都被判断出来了。
est
2015-11-12 11:25:07 +08:00
@xujif 我也是这样想的,但是从代码维护的角度来说,每人工增加一个 magic id 就要改代码,部署流程,或者改 config ,感觉略蛋痛。
est
2015-11-12 11:25:43 +08:00
@ts reddit hacker news. 我现在也想找别的地方混。
est
2015-11-12 11:26:04 +08:00
@cyr1l 差不多是这个方向。。。不知道大家有没有灵光一现更加 NB 的。。
Elethom
2015-11-12 11:26:42 +08:00
那自增就沒有意義了。還不如 hash 。
zhujinliang
2015-11-12 11:29:23 +08:00
之前有个类似的需求,当时的做法很 2b
把 id 以十进制表示,然后每位随机做一个的对照表,然后再拼起来
RitianZhao1988
2015-11-12 11:35:11 +08:00
内部一张表,外部一张表
外部增加时有几率增加 rand 个魔术 id ,然后在内部表里再写一份没有 magic id 的怎么样?
undeflife
2015-11-12 11:42:36 +08:00
@est 你的"间隙" id 同样不能解决这个问题
如果 /users/xxxx 这样一个 url 并不存在分享的需求的话 无所谓友好不友好.
如果存在分享的需求的话 /users/username 这样不是更好吗
所以我认为完全可以从设计上弱化 uid 在用户这的存在

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

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

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

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

© 2021 V2EX