0

Anti-spam

Posted 五月 10th, 2010. Filed under 我是程序员

by zcc @2010-4-29

背景

这是一个比较 大的话题,由于经验有限,这次突击专题后所做的笔记也比较琐碎。泛滥的自动注册机和垃圾帖困扰着很多互联网产品,怎样反抗它们的进攻,如何降低spam爆 发率。本文主要给出相关的介绍,以及一些解决方法的思路。由于时间有限,尽量给出简单的实验性demo。

现状

从发帖机的 类型上来看:

  • 白痴型发帖机(自己做的发帖机,嘿嘿)
    • 自动注册发帖指定内 容
    • 开启简单的认证码就可防御
  • 半人工发贴机(狂人算一个)
    • 提 供发帖帐号库和文章库实现自动调用
    • 基本具备自动化的功能
    • 无法识别验证码(但通过自动获取验证码区域,这部分通过人工 绕过)
  • 强悍型发帖机(蓝 鸟论坛自动发帖机,没试过
    • 自动注册账号,也可由用户已注册过的账号
    • 有效识别论坛验证码
    • 根 据发帖时间限制,调整延时设置
    • http代理设置(防止IP被封)
    • 自动识别Discuz/PHPWind/DVBBS /Leadbbs
    • 多方案同时工作,同时对6-7个不同的网站同时发帖
    • 随时查看发帖机状态
    • 论坛地址 可从地址列表自动读取,省去手工输入的麻烦
  • 智能型发帖机
    • 加入了人工智能,内容更人性化
  • 人 肉发帖机
    • 最智能的发贴机;也是可预见的最有效的方法
    • 雇佣低成本的人工劳力,配合一些简单的自动化软件进行武 装

从目前的防御手段上来看:

  • 验证码
    • 采 用最广泛也是目前来讲最有效的方案
    • 下面会详细剖析这个主题
  • 帐号限制
    • IP限制
    • 邀 请注册(相关认证)
    • 激活方式(邮箱激活、短信激活)
    • 对用户进行等级划分,对低等级用户进行相关限制
  • 智 能过滤
    • 采用算法进行相关判定过滤
  • 人工审核
    • 道高一尺,魔高一丈,最直接 的方法还是人肉!
目前phpwind中功能上的防御方案:

  • 邮件 激活注册用户 (成功率:中,效率:低)
  • 邀请注册(成功率:高,效率:低)
  • 同一IP重复注册(成功率:低,效率:高)
  • 注册邮箱黑白名单(成功率:低,效率:中)
  • 新会员发帖控制(成 功率:中~中高,效率:中)
  • 开启认证码(注册、前台登录、发帖)(成功 率:高,效率:低)
  • 验证问题设置(注册、前台登陆、发帖)(成功率:高, 效率:低)
  • 灌水预防(成功率:低~中低,效率:高)
  • 注 册文件名修改(成功率:低,效率:中)
  • 限制低等级会员权限(成功率:高,效率:低)
案发事件及事发方的 窘境:
  • 一些自动注册发贴机为了绕过新会员发帖限制,会采用先进行疯狂注册,隔一段时间再进行发帖操作
  • 通 过代理绕过同一IP重复注册
  • 注册环节可开启相关限制,但在发帖环节开启验证码的话会严重影响用户体验
  • 为了不减少新用 户数量,开启邀请注册等功能不在考虑范围之内

总结到这一步,我不得不再做一次方向上的确认,范围上再收缩一下。首 先,需要明确的是我们的敌人到底是机器人(自动注册发贴机)还是垃圾信息。我们所能给出的方案能够有效地做到哪个程度,哪个深度是我们目前花合理的人力、 时间也无法到达的。由于phpwind是通用型产品,也由于目前的技术限制,没法在数据挖掘、AI上去获得相关资源,所以这里就确定我们要针对的是机 器人(从严格意义上来看,似乎本文标题上就有些歧义)。

纯理论地来讲,机器所做的无非是在有限程度上使人工自动化。而目前大多数 机器人的工作流程如下:

  1. 用 户通过浏览器向服务器发出页面请求
  2. 服务器返回给浏览器指定的html页面
  3. 用户将填好的表单通过浏览器向服务器发送数 据
  4. 机器人通过内置的伪浏览器(比如php中的curl)向服务器发出页面请求
  5. 服务器返回给机器人指定的html页面
  6. 机 器人根据服务器返回的html代码和自己的文章库制造post数据,发送给服务器

那么怎样去识别客户端是人还是机器呢?机器 和人的区别是什么?
在客户端上,机器的伪装技术几乎可以搞定放在客户端上的所有验证环节。另外就近几年的技术而言,机器(计算机)的识别能力主要 在于上面,而在图像、词语逻辑等上面还相对较弱。虽然客户端(浏览器)都能获得HTML页面,但如果在HTML页面上相关消息给出的形式 不是文字,而是图像或者一些判定逻辑的话,机器在识别上就会遇到阻碍。这也就是验证码的基本思想。验证码本身并不复杂,但放在应用环境中就会变得深不见 底。接下来就以验证码为入口,继续anti-spam的旅程。

验证码

比较权威的定义:

全 自动区分计算机和人类的测试CAPTCHA, Completely Automated Public Test to tell Computers and Humans Apart),是一种区分用户是计算机的公共全自动程序。在 CAPTCHA测试中,作为服务器的计算机会自动生成一个问题由用户来解答。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算 机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。

—— 维基百科

phpwind验证码前端:


纯 4位数字验证码

纯4位英文验证码

加入各种干扰条件的英文验证码

还有gif动画的以及中文验证码等等

其他产品 中的验证码及对应的被识别率:http://caca.zoy.org/wiki/PWNtcha

插 播:验证码的威力在于,从理论上来讲想要绕过它唯一的途径就是在识别环节上,而图像(或逻辑、音频)的识别恰恰是目前机器的弱点。而复杂的加入干 扰条件的图像验证码,会让大部分的机器人望而却步。

phpwind验证码生成机制:

  1. 在 ck.php中根据设置的验证码类型产生一个随机的验证码字符串
  2. 将产生的随机字符串加密后与时间戳一并存入 cookie(’cknum’)(加密不可逆)
  3. 使用php的GD库绘制验证码图片
phpwind验证码验证机制:

  1. 服务器获取客户端提交过来 的字符串(gdcode)
  2. 用SafeCheck函数拿$gdcode与cookie中的cknum进行校验

phpwind 所采用的验证码机制也就是这篇文章中所提到的更高级的验证码,并且做到了抵御过期cookies 法(加入时间戳以及过期作废cookie)。

验证码的危害

验证码的危害基本就在用户体验上,这项 不属于用户信息的必填环节浪费了用户太多的时间,围观抱怨1抱 怨2

低成本防御

从技术角度看,有漏洞的软件总是不好。但从商业角度上来看,从成本分析上来看,能够以合理的性 价比满足需求就已经达到目标了。比如在为一些中小型站服务的时候,相应的机器人肯定也是廉价的机器人。它们大多数也就是通过购买自动注册发帖软件来低成本 地制造spam。所以,只要给出一个短时间内的临时修改方案,对方就不得不进行软件的升级。而该临时方案如果不是很通用的话,机器人软件也不会对一个不通 用的目标进行专门的升级。(程序员们别鄙视我这个非典型程序员~)

实验Demo

1. 自动注册发贴机

只是用来做实验及学习curl的demo,功能上简陋得很~

功能及实验注意点:

  • 利 用预先设定的用户名前缀自动注册
  • 利用自动注册的帐号自动登录并遍历设定的板块ID范围进行发帖
  • 预先设定发帖间隔(最 好取消灌水预防来做实验,如有灌水预防,请务必设定大于灌水预防的发帖间隔)
  • 最好关闭CC攻击防护
  • 以./main.php 开始,结束么就自己关掉页面好了


下载地址:
本地链接

2.发帖页面监听

原理思路:通过监听发帖页 面的用户动作,来确保客户端是通过发帖页面通道来进行发送数据的。本demo是通过监听输入区域的onkeydown/onkeyup动作,触发 ajax(do_by_hands.php),而被触发的程序生成一个该用户的临时缓存文件。发帖的时候就加入一个点来判断是否有生成临时文件就ok了。

漏 洞:还是老话,客户端的校验如何防止被伪造本身就是问题!发贴机根本就不需要伪造用户动作,直接分析出被监听的动作是什么 (do_by_hands.php),发送了什么数据,然后直接(向do_by_hands.php)发送相关数据就可以绕过了(伪造好cookie的前 提下)。另外一个原因是,不敢保证效率上会不会有问题。

进一步防御(本demo没有实现):针对上面的问题,进一步改进: 被触发的动作文件(do_by_hands.php)文件名可以进一步设置成随机,可以进行一定程度上的加密。这样就可以从表面上防止了机器人的绕过。

下 载地址(pw 7.5 sp3 gbk):本地链接 (代码注释:// anti-spam by zcc)

3.隐形验证码

原理思路:通 过在机器获取验证码环节上给出相关阻碍的方案。常规的验证码在内容本身上加密以及随机,但本方案是在DOM元素上的随机加密。假如这个加密方案成功的话, 也就不需要内容本身了,及验证码隐形。对于机器人,虽然隐形验证码的dom元素ID和值都是可见的,但因为值本身是随机的,所以无法定位。

具 体步骤:

  1. 产生一个随机的验证码字符串
  2. 将产生的随机字符串加密后存入 cookie(’ckxnum’)(可逆的加密)
  3. 生成隐形验证码的页面(<input type=”hidden” name=”$xcode” value=”$xcode” />)
  4. 服务器端根据cookie中的加密字符串进行解密得到变量的 名字
  5. 根据得到的变量名获取隐形验证码的表单值进行验证


漏洞:
机器人可以通过正则表达式等方 式来获取未知名的表单元素(也就是根据位置)。

进一步方案(本demo没有实现):根据机器人的获取元素方式进行针对性的 改进。(说的比较扯淡,囧!)
另外,这个可逆的加密方法可以进一步改进,也可以增加后台控制。

下载地址(pw 7.5 sp3 gbk):本地链接 (代码注释:// anti-spam by zcc)

总结

关于防自动注册发帖的想法和 相关情况叙述到这里,我并没有给出一个能够立马拿得出手的武器,没法一针见血地解决问题,这些都在情理之中。但是,从这些资料的阅读和思考中至少可以明白 这个方向的一些技术难点、敌方所采用的战术等等。不像刚开始接触的那样,自以为找到了一种可以破解的有效方案。上面所给出的实验demo也肯定会是一些漏 洞百出的方案,只是一些试图去解决的思路而已。仅此抛砖引玉,来进一步探究anti-spam的话题。

参考链接

If you have enjoyed this entry. Please feel free to bookmark it using your favorite social bookmarking site

Leave a Comment