在上一章中我们分维度统计数据的时候,是将不同维度的数据求和,然后看这个和的大小。但是我们仍不能忘了一个重要的前提,就是时间。
还是以用户登录为例,Jim想要登录自己的社交网站,我们可以因为他连续10次输错密码阻止他登录,但是不能因为他10个月里每个月都输错了一次密码。
换句话说,我们限制的是频率(次数/时间),而不是简单的总数。而限制频率也是最常使用的手段。
先列举一些常见的限制频率的场景:
- 限制每天用户输错密码的次数,用以控制密码暴力破解
- 限制每台设备领用优惠券的次数,用以控制普通用户注册多个账号刷券
- 限制每张银行卡每天的消费金额,用以控制盗号
简单:无论从统计逻辑还是理解上,都是十分简单
快速:对频率的计算和比较,都是一些基础的计算。无论是数据库还是程序,对这类计算都很好的支持,且不需要很多高耗时的算法
应用范围广:你几乎可以在每一个场景下找到它的影子
实时性强:往往不需要大数据的离线计算,可以实时统计,实时使用
也有场景局限:对于利用漏洞导致的攻击,或者复杂的场景,限制频率的效果有限
可以减缓攻击,不能阻止攻击:虽然限制了频率(给定了一个阈值),但是在达到阈值之前的请求可能会被放过,例如限制每小时密码可以错10次,实际上每天还是可以尝试240次
绕过手段成熟: 通过批量注册、IP代理、多开虚拟机等手段可以削弱频率类规则的效果
你可能已经猜到了,很多场景下,我们通过限制一个指标的频率很难起到作用,很容易被绕过去。这个时候我们可以从多个维度入手,限制多个维度的频率。
除了多个维度的限制,在单个维度的单个指标上,也可以限制多个频率。
还是拿暴力破解密码的场景,限制“每小时密码可以错10次”的基础上我们增加一条“每天只能错15次”,这样虽然没有克服缺点中的第二条,但是比原来的方案更好的保护了用户。
我们认为不同的频率限制有不同的可疑程度,满足“每天只能错15次”的请求要比“每小时密码可以错10次”更可疑的,所以我们对前者的惩罚更重,或者验证更谨慎。
IP维度的频率规则很常见,但很多时候并不好用。因为黑产通常会购买大量代理IP,通过一个代理IP请求几次,再换下一个代理IP。互联网上有大量代理IP,价格很便宜,很多甚至是免费的,所以这么做的成本很低。
对抗代理IP的方式主要是:
- 过滤海外IP。大量代理IP来自海外,例如委内瑞拉、荷兰、印度尼西亚、美国。对海外IP进行二次校验,可以快速增加黑产的成本
- 爬取公开代理IP。很多网站会提供免费的代理IP,我们可以用爬虫爬取这些IP,进行拦截
- 购买代理IP。和黑产一样,直接花钱购买代理IP。相比较第二步,我们无需开发爬虫,也可以快速获取大量代理IP