根据 Hashcash 做的 反机器人 CC 攻击算法

2014-12-24 04:20:28 +08:00
 typcn

我想了想还是单独贴出来让更多的人看到,大家一起看一下可行性以及是否存在问题。

体验可以到这里 http://blog.eqoe.cn/ 在右边进行搜索

我们可以看到点击搜索的时候客户端发送了 3 次请求。

客户端计算 Hash 示例代码

var tk = "获得的TOKEN内容";
var str = 10000;
var lasthash = "";
while(lasthash.indexOf("0000") != 0){ //如果 lasthash 前4位不是0则持续循环
    str++;
    lasthash = sha1(tk+str.toString()); //把 Token 和 数字拼接起来
}; //经过多次测试 PC端计算大约需要1-3秒 移动端需要2-5秒

如果需要的话你可以对我的 blog 进行压力测试,别打太狠就行。。。

假设使用 C 语言制作客户端计算一个 Hash 需要 2 秒,攻击者使用 16 核电脑和若干代理IP,那么你的服务器每秒只会收到 8 个以下的请求,这种算法应对一般的攻击应该可以无压力的防住吧?

6767 次点击
所在节点    分享创造
51 条回复
ihacku
2014-12-24 07:01:07 +08:00
typcn
2014-12-24 07:27:20 +08:00
@ihacku 思路都一样吧,具体实现稍有不同。在计算的时候浏览器会假死,用户打字会超难受,而且没法根据输入内容动态生成key。

这个明显有问题,在计算出key之后,使用相同的时间和key可以提交很多次,经过超时时间后再之重新计算,要是针对的话基本跟没有一样。
zeraba
2014-12-24 07:52:11 +08:00
貌似还有通过解析器进行判断的 nginx+ lua
RIcter
2014-12-24 08:02:10 +08:00
这种算法是不是需要在后端计算出lasthash?
如果我大量POST前四位为0但是后面随机的hash,后端会不会因为大量的计算而卡死?
RIcter
2014-12-24 08:04:57 +08:00
又看了一遍…后端没验证hash是否正确,只验证了前四位是不是0?
这样不还是可以bypass么…
typcn
2014-12-24 08:05:56 +08:00
@RIcter 先校验 TOKEN 是否符合,才计算 lasthash 的,一个 IP 地址同一时间只能拥有一个 TOKEN,在发放 TOKEN 的程序做一些限制就好了。

另外做 hash 运算不算什么吧? PHP 的 SESSION 也需要计算 hash 啊。
typcn
2014-12-24 08:06:30 +08:00
@RIcter 这个肯定是要先校验是否符合再校验是否为0的 我写的有些不严谨
sanddudu
2014-12-24 08:08:58 +08:00
@RIcter 如果完全验证,用户数又多,就会被拖死
wy315700
2014-12-24 08:09:37 +08:00
hash前四位是0 不就是挖坑的思路吗
typcn
2014-12-24 08:17:35 +08:00
@RIcter 如果严格一点的话, POST 的时候不需要上传 token,后端自动根据用户的 IP 地址到数据库/内存缓存中取 token,然后拼接 token 和 用户计算出的数字,验证 lasthash 。 如果验证成功删除这个 IP 地址对应的 token 。
a2z
2014-12-24 08:18:31 +08:00
@RIcter


计算完POST过去的时候内容是:
TK:4ceda3e028287b9b6d1e1a2ba904e4b4d75761af
ua:20389

两个拼起来hash的确是00008e2609258df65582eea4e51c91259f3b780d

但是这个hash并没有发送到服务器。
服务器只需要把TK和ua拼起来计算下sha1是否前四位是0000就行了,也就是说客户端要计算几万次sha1,服务器只用计算1次。

有种挖比特币的感觉。
typcn
2014-12-24 08:19:12 +08:00
@a2z 是的 就是根据比特币的算法想出来的
RIcter
2014-12-24 08:32:24 +08:00
@a2z souka,才反应过来T^T
a2z
2014-12-24 08:32:52 +08:00
@typcn

token根据ip计算的话有点多此一举的感觉,直接限制每个ip的访问次数不就行了,和v2ex一样。
typcn
2014-12-24 08:36:36 +08:00
@a2z 这个倒是。
我开启 IP 验证是因为怕碰到代理狂魔。vps 上开着 Minecraft 服务器,各种数据库,剩的资源很少,太容易被打挂,每个月已经 700 多了,0 收入,实在不想加钱了。
typcn
2014-12-24 08:38:11 +08:00
@a2z 又不想限制访问次数,怕误伤
rrfeng
2014-12-24 08:38:39 +08:00
我感觉到一种很容易针对这种策略的攻击的可能性
比普通的 CC 可能还要高效……
kslr
2014-12-24 08:40:36 +08:00
就是个令牌桶算法++
typcn
2014-12-24 08:43:44 +08:00
@rrfeng 说来听听?
a2z
2014-12-24 08:46:54 +08:00
@rrfeng
@typcn

我也想到了 :D

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

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

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

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

© 2021 V2EX