留言加了个反 spam 手段,不确定是否工作正常

转载

方法以前就想过,不过当时 spam 不是很多,也就懒得弄,直到最近过分了点,不得不去加上这个小手段

方法比较老土,是用的 md5(可能说到这有些人就不需要解释了),在提交留言的 form 里,多发一个隐藏项,值是时间戳,类似这样:

<input type="hidden" name="checkTime" value="1152777009" />

而正常填写项的 name (我这里有 guest、email、content 等几项)是 md5(checkTime + 原name,如“email”+ 私钥,可能这个名字不太合适),就是说根据 checkTime 变化而变化。

结果就是,我原来可能是这样:

[quote]
<form method="post">
<input type="text" name="guest" />
<input type="text" name="email" />
<input type="text" name="url" />
<textarea name="content"></textarea>
</form>
[/quote]

现在变成了这样:

[quote]
<form method="post">
<input type="hidden" name="checkTime" value="1152777009" />
<input type="text" name="3776712a3f4f8acae3bd9a133b65616b" />
<input type="text" name="6548f70199d1f079a92732da6bc3140d" />
<input type="text" name="5d8d2cd0fd97e5e90b41055e851f93a9" />
<textarea name="c3d1c5cdbd2caef5cddfee48b337f55e"></textarea>
</form>
[/quote]

因此除非 spammer 每次都现抓我的网页,否则他不知道提交的变量的名字(虽然变量的内容是他早已准备好的),也就无法自动的、大批量的发送 spam

checkTime 作为一个校验值,一是用来推导表单各项的名字,一是用来保证过期(这里我要做一个假设,没人会花一个小时的时间去留言,如果你觉得这个假设不好,改成一天也成)。这是为了防止 spammer 搞明白你的表单项名称后继续一劳永逸

这个方法仅仅是为了不受普通机械的 spam 折磨,人肉 spam 无效,但我觉得到这一步已经算胜利了,人肉 spam 的成本太高,而且删比填要省事。这只是个初始想法,还可以再加点干扰项(放置一堆额外的 <input type="text",通过拐弯抹角的 css 来让这些隐藏项目,没有或者非空都算有问题)什么的,比起验证码什么的要好太多(成本、对用户干扰等等方面)。

如果这个东西出问题了,留言者可能会看到我留给 spammer 的话或者提交后没任何响应,还是提交前的页面。如果有空的话,请帮忙留言测试一下(老实说,如果换成我是观众,我可能会置之不理),如果出了问题并肯花时间告诉我,gmail 信箱,用户名 zheng.kai,不胜感激。