根据 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 个以下的请求,这种算法应对一般的攻击应该可以无压力的防住吧?

6645 次点击
所在节点    分享创造
51 条回复
nilai
2014-12-24 11:30:52 +08:00
@typcn 另同一局域网下都是同一个外网IP。何解
typcn
2014-12-24 11:32:08 +08:00
@nilai 不可能两个人同时在搜吧?
lecher
2014-12-24 12:35:45 +08:00
这个仅仅就是防单机单ip发起的cc。
但是就像binux大神说的,单机多ip代理无限构造0000+随即字符串,根本不用算正确的请求,就可以打死了。
和打有验证码的一个道理,不用突破到数据库处理层面,直接多ip代理打服务器,服务器光是计算hash和缓存hash的结果就要算到死了。

也不一定是打搜索页面,比如打注册账号验证用户名是否有效和邮箱是否有效的请求,这个一般网站为了一致性,缓存找不到的一定回去数据库查的,而校验用户名有效性这个请求,一般都没有做校验就直接打到数据库了。多ip代理打过去,服务器的压力要比单机的压力大一些。
millken
2014-12-24 12:51:41 +08:00
方法很新颖,我去尝试下。

真正的防御应该是应用层验证(js,flash,captcha),提交验证未通过的ip到防火墙。
lqs
2014-12-24 14:02:54 +08:00
把while循环改成for一个固定次数加setTimeout 1ms,就不会让浏览器卡住了
nilai
2014-12-24 14:36:09 +08:00
@typcn 完全有可能, 现在的移动网络是一块区域内的用户用几个公网IP。
zhicheng
2014-12-24 23:25:22 +08:00
hashcash 必然是有效的,要不然 bitcoin 早就被攻击死了。
LS们讨论的大量IP+0000随机数的不太现实。。。
sha1 大部分语言 100K/s hash 轻轻松松的。但你不太可能有那么多 IP 地址。或者说,如果真有这么大的资源,也无所谓攻击这个地址了,静态页面都能打死了,光流量服务器都撑不住。完全不在一个讨论层次上。
小规模的单服务器网站,直接在存 session 在页面渲染出挑战值就可以。
大规模的多服务器网站,可以用 hmac(ip + timestamp) 做挑战值,验证写到 nginx 里,性能损失可以忽略。
kocd
2014-12-26 16:04:22 +08:00
我事先得知一个前4位是0的一条tk_after,返回给你tk和tk-tk_after。。。
是不是能不停的攻击你。。。
typcn
2014-12-26 16:59:28 +08:00
@kocd token使用完自动回收啊
kocd
2014-12-27 07:05:08 +08:00
@typcn 你的服务器端好像只判断(tk+一个数字的hash)前4位是0,我每次请求你都给我一个tk,我只要返回tk和我已知的随便一个tk_after的tk_after-tk对吧,没做过网站,单纯从逻辑考虑的。
typcn
2014-12-27 07:54:57 +08:00
@kocd TK 在用过一次后就立马被销毁的,下次用就提示失效。

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

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

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

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

© 2021 V2EX