搞了anti-spam之后,发现原来杀毒软件的原理也是类似的,浏览器的AdBlock插件原理也是类似的.
- 目的
垃圾是不可能根绝的,就跟犯罪不可能根绝一样.所以anti-spam的目的,就是提高攻击成本,降低防御成本.攻击者的目的无非就是牟利,当他们成本太高的时候,就会降低攻击力度.
- 攻击者的智慧
- 人肉打码:绕过验证码
- 淘宝"注册账号交易"
- 代收短信业务/代收邮件业务:绕过手机动态口令验证和邮件激活
- 新帖秒回
- 逆向app获取密钥
- 机器刷接口
- 伪造ip
通过修改http header的x-forward-for来伪造ip
- 检测手段
- 内容
- 敏感词过滤(用AC自动机进行多模匹配)
- 相似度过滤
- 文本相似度(shingle算法)
- 图片相似度(ahash/dhash/phash)
- 垃圾帖子的内容中一般有联系方式如url/手机号/qq号/微信号等.
- 行为
- 没查看就回复帖子
- 发帖太频繁
- 频繁变ip
- 频繁清空cookie
- 注册账号使用类似的email/用户名,比如akjlhiol/akjihlol等.
- 属性
- 注册时间
- 用户等级
- vip
- 小编账号
- 内容
- 防御手段
- 验证码
- 注册登录要验证码
- 异地要验证码
- 发帖频率过快要验证码
- 加cd时间
- 等级制度
- 黑名单
- 工作量证明
比特币挖矿这么耗电,其中一个原因就是工作量证明.原理就是利用工作者(客户端)和验证者(服务端)工作量的不一致.比如我们让用户在某些敏感请求前做10w次的md5运算,对于正常用户来说这点不算什么,对攻击者批量发请求来说,就是一个很大的负担了.具体做法可以是,验证者给定一个随机字符串s,工作者必须找出一个数n,使得随机字符串拼上这个数n后的md5结果前面几位都是0.即md5(s+n)的结果符合验证者的要求.工作者只能不停的穷举,找出这样一个数n.而验证方只需要拿工作方给过来的n,进行一次md5即可验证.即if
md5(msg+str(n)).hexdigest()[:4] == ‘0000‘. - 签名参数sig
客户端对请求的内容进行签名(生成一个hash值),服务端验证签名.需要对客户端代码进行混淆,而且尽量不采用开源的混淆算法.
- 烟雾弹
比如用户发一个垃圾帖,我们如果直接删帖,攻击者马上就知道了,他就会寻找其它策略.但是如果我们放烟雾弹,让他的请求无效,但是还返回"成功",或者删了帖,那个帖子只有发布者自己能看到,其它人看不到,发布者就会以为发的帖子没被删.
- 钓鱼
让客户端增加一个无关紧要的参数,攻击者不会马上知道,还傻傻的按照以前的请求参数发送,因为我们知道没有这个参数的客户端不是正常的客户端,于是我们可以从这个时间起收集这些攻击者的账号id,等收集的差不多的时候就扫荡封杀掉.
- 验证码
- 惩罚级别
- 禁言
- 删号