想到一个自增 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 呢?
15573 次点击
所在节点    奇思妙想
85 条回复
wy315700
2015-11-12 11:47:31 +08:00
@est short_uuid 是 MySQL 的一个 64 位增长型 ID 啊,就是满足你的要求的,
18000rpm
2015-11-12 11:53:37 +08:00
跟着思路走只能想到多挖几个坑 233
一个一位数的坑
两个两位数的坑
三个三位数的坑
能整除的都不能踩,不知道这个在没遍历前还好不好猜规律
lwbjing
2015-11-12 11:58:34 +08:00
mongodb _id
oott123
2015-11-12 12:00:57 +08:00
lincanbin
2015-11-12 12:06:11 +08:00
用 GUID+截断的时间戳作为主键,可以获得更高的插入效率,同时也可以一定程度防止爬虫。
muzuiget
2015-11-12 12:11:43 +08:00
自增 id 只在服务器器使用,对外就 hash 不就行了么, hash 同表也是唯一,允许所以?不让客户端通过 id 访问到资源。
imn1
2015-11-12 12:15:54 +08:00
虽然会增加我将来爬东西的难度,但还是要说一句话:
外显有序 id 是低智商

说个故事:
上世纪末,要抓日本某站点一批数据,当时只知道 max(id)>=17000 ,步长 1 自增
还不会写爬虫,于是开网络蚂蚁批量,直接下
大约抓了 5000 条左右,那站点停了几小时,然后页面浏览器访问顶部出现了“巡回禁止”的横条,哈哈
然后发现大约下 1000 条左右后面就会全部 404
老子 proxy 多,当年还没有 qiang 的概念, ssl proxy 都是稀有物,但 http proxy 还是不少,因为原生网路就不畅,非人为原因……
然后就每 800 条换一个 proxy ,爬完(换了多个确认是真的没有数据而不是 404 ),总数 26000+条
这是当年不为爬 qiang 而使用梯子的典型例子
凭这 2w 条信息,虽然没有全部发布,并且是重新组织和翻译,在小圈子也有点名气
但也属盗版了,后来还是怕担责(即使日本追究不到我这来),撤了,自此之后虽然爬数据,但再也没批量公开发布了
反正从那时开始我就禁止后台程序员使用外显有序 id 了

@akira 说的是对的,其实不要想什么算法,因为读取的次数比写入多得多,在写入时产生一个唯一用于外显的 uid 则可,读取时用算法判定会严重增加机器负担
est
2015-11-12 12:30:26 +08:00
@undeflife 用户 id 只是举个例子。有很多时候会用到 id 的。
@imn1 其实还有一招。就是不封,也不返回任何错误,直接随机产生垃圾内容。。。让你区分不出来内容是否真实的。。。我抓 bing 就遇到这问题了。。。。。。。嗯。。。。。。。。

即便是外显 uid ,也是需要防止爬虫呀。。。这个时候除非做 hash ,否则依然也是有问题的。
est
2015-11-12 12:32:33 +08:00
@wy315700

仔细看了下

The UUID_SHORT() return value is constructed this way:

(server_id & 255) << 56
+ (server_startup_time_in_seconds << 24)
+ incremented_variable++;

感觉也算一个不明显的自增 id 的思路吧。。。。
est
2015-11-12 12:35:50 +08:00
@oott123 好东西。不过 ruby 有个更好的,基于 Perfect hash function 的 https://github.com/namick/obfuscate_id
imn1
2015-11-12 12:37:45 +08:00
@est
我没说不防啊,只是你别只穿着内衣上地铁,然后举个牌子“我可以骚,你不可扰”,这算什么?
livelazily
2015-11-12 12:42:25 +08:00
跳过所有质数
oott123
2015-11-12 12:46:59 +08:00
@est 恕我愚昧,没发现哪里“更好”了。
lerry
2015-11-12 12:52:25 +08:00
twor2
2015-11-12 13:04:53 +08:00
uuid 只是视觉上的长,其实还好,网址都是点进去的,就算是 1234 ,也不会有人敲进去吧
liboyue
2015-11-12 13:05:51 +08:00
用一个表呗。把顺序的内部 ID 映射到随机 ID 上,多一次查表的操作
XiaoxiaoPu
2015-11-12 13:10:58 +08:00
把自增 ID 用 RSA 加密(或其他加密算法),加密后的结果给用户,用户传过来的 ID 解密,不知道是否可行
est
2015-11-12 13:19:56 +08:00
@livelazily 2333 好办法!
ts
2015-11-12 13:20:24 +08:00
@est 有中文类别的坛子或者网站吗 求大神的 bookmark .....
millken
2015-11-12 13:36:02 +08:00

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

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

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

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

© 2021 V2EX