Total Pageviews

Wednesday, 13 February 2013

如何防止论坛群发器

论坛群发器是很讨厌的,注册的时候占据了用户数不说,某些机器人还不止一次地发广告,在论坛里每个版面都发,删都累死所以我们要把机器人拒之门外怎么办呢……
首先要明确的问题是,机器人是很笨的,我们用一些非常规的方法就可以把笨蛋机器人狠狠地忽悠掉。 这里就提两个方法好了

方法一
笨蛋机器人看到一个验证码图片,会自然而然地把里面的数字或字母全部识别出来,然后一股脑都填到验证码框里。这里我们就可以利用一下了。假设我们生成的验证码图片有6位数字,那么我们可以告诉用户,你只要输入前5位,也只能输入前5位数字。如果是人的话,自然会知道只要填写前5位数字,而笨蛋机器人就不知道了,它会把全部6位数字填入。这样,只要我们发现有谁输入的验证码是6位的,就可以把它干掉了,这家伙十有八九是个笨蛋机器人。
关于如何告诉用户只输入前5位验证码的方法很多,你可以直接在网页上用自然语言描述出来,或者更进一步,不直接写在网页上,而是写在图片上,再加上一些干扰,这样打死这个机器人它都不知道我们想要告诉用户什么了。如果你的论坛用户层次较高,你更可以描述得复杂一些,比如下面的描述:“为了防止恶意注册,请你不要完整地输入六位验证码。你应该做的是只输入验证码的第壹位到第五位,而不要输入四位,或者六位,或者其他位数的验证码。也就是说,你只要输入验证码的前五位就可以了,第六位验证码是没有用的。比如说,你看到的验证码是123456,那么你只要输入12345就可以了。如果输入23456或者是1234556或者是1234或者是其他的数字的话,都是错误的。输入错误的话你就不能注册了。” 再来点干扰,笨蛋机器人想要认出这上面的字都已经很困难了,更不用对这么长的文字进行语义分析,得出我们想要告诉用户的信息了。仅输入验证码前5位是一个方法,我们也可以采用其他方法,比如说输入后5位,或者说仅输入验证码里面的偶数,或者是仅输入大于5的数,仅输入位于M后面的字母,仅输入小写字母,方法可多了。这些方法描述起来可就比“输入前五位”复杂了,笨蛋机器人更加不可能知道我们到底在说什么了。 当然,方法一需要用户参与,如果用户层次较低,水平不高的话,方法一是不太好的。下面的第二种方法可以在用户不参与的前提下禁止掉机器人。

方法二
一般我们的注册都要求用户输入电子邮件,我们可以这样做。按照正常的方法,表单中的电子邮件文本框的名字都是email,用户名文本框的名字都是username,笨蛋机器人也是通过文本框名字判断每一个文本框应该填入什么数据。这点和人不同,人并不通过文本框的名字来判断文本框应该输入什么,而是通过在网页上的描述来判断不同的文本框应该输入什么数据的。利用这一点,我们就可以把人和笨蛋机器人区分开来。我们可以这样构造一个表单:

    <form action="#" method="post">     
        用户名:        <input name="email" type="text"> 
        密码:        <input name="pass1" type="password">     
        重输密码:    <input name="pass2" type="password"> 
        电子邮件:    <input name="username" type="text"> 
    </form>   

注意到了没有,我们把本应输入用户名的文本框的名字改成email,本来应该输入电子邮件的文本框的名字改成了email。这个网页显示出来,用户看起来是很正常的,会在第一个文本框输入用户名,第二个文本框输入电邮地址。而笨蛋机器人是通过文本框的名字来判断文本框应该输入什么的。笨蛋机器人看到第一个文本框的名字是email,就会以为这个文本框应该输入电邮地址,于是就在第一个文本框中输入了电邮地址,同样地,在第二个文本框输入了用户名。这下就好了,我们在程序中只要判断POST(“username”)的值是不是一个邮件地址,POST(“email”)的值是不是一个非法的邮件地址,就可以判断出这个注册请求到底是人提交的,还是笨蛋机器人提交的了。当然笨蛋机器人也可以不通过文本框的名字来判断文本框应该填入什么数据,它们也可以通过判断<input />前面的文字来判断文本框应该输入什么数据。这个问题好解决,我们可以不直接写“用户名”“电子邮件”等文字,老办法,我们用图片来写,再加上些干扰。你可以吧“用户名”“电子邮件”全部写在一张大图片上,然后对<input />使用绝对定位来把<input />固定到对应的位置。在这张大图片上,你可以再写上一大堆不相干的文字,再加上些干扰,这样笨蛋机器人就很难知道哪个文本框应该输入什么内容了。更进一步,你可以不使用email、username来给文本框命名,你可以使用随机字符串来给文本框命名,只要你在服务器先生成随机字符串,然后记着每个字符串对应的应该是什么值就可以了(其实我还是觉得对调email和username更能骗过机器人)但是要注意的是,自动填表工具在进行填表时也是通过文本框的名字进行填表的。如果对调email和username的名字的话,填表工具在进行填表时就会出错。对于这一点,可以在提交前先检查用户输入的email和username是否正确(当然用户就要麻烦点了)。
现在樱町使用的是第二个方法,到现在为止还没有发现哪个笨蛋机器人识破了这一招。以前樱町使用的是第一种方法,不过没有使用语言进行描述,而是使用CSS屏蔽了验证码的第6位(overflow:hidden;width:100px; 每个数字长20px)。但是这个方法竟然已经被识破了,现在的机器人真不像以前那么笨了,能识别CSS了(或者是这个方法有太多的人用了?)。
该用哪种方法,你应该根据自己和论坛的实际情况进行选择。机器人始终是机器人,只会死板地根据人的指令(虽然人也可以给出复杂得使机器人行为和人差不多的指令)去行动,它并不具有人类所具有的高级思维(至少现在是这样的)。只要想出一些人很容易能办到,而机器人却很难办到的事情,就可以用来防止机器人胡乱注册。防笨蛋机器人的方法是很多的,只要你愿意动脑。如果一直使用别人公开的方法,当这个方法被机器人的幕后知道以后,一般很快这个方法就会被机器人识破。所以,自己想出来的另类的方法是最能有效抵挡笨蛋机器人乱注册的。动起你的脑袋来,大脑不用会生锈,机器(人)常维护更灵活,开个论坛也是需要一定知识和想象力的。