我已经开发出一种方法,该方法似乎运行良好(尽管我可能不会收到像您一样多的评论垃圾邮件),方法是有一个隐藏字段,并用虚假值填充它,例如:
<input type="hidden" name="antispam" value="lalalala" />
然后,我有了一段JavaScript,它每秒以页面已加载的秒数更新值:
var antiSpam = function() {
        if (document.getElementById("antiSpam")) {
                a = document.getElementById("antiSpam");
                if (isNaN(a.value) == true) {
                        a.value = 0;
                } else {
                        a.value = parseInt(a.value) + 1;
                }
        }
        setTimeout("antiSpam()", 1000);
}
antiSpam();
然后,在提交表单时,如果反垃圾邮件的值仍为“ lalalala”,则将其标记为垃圾邮件。如果反垃圾邮件的值是一个整数,我会检查它是否高于10(秒)之类的值。如果低于10,则将其标记为垃圾邮件;如果低于10,则将其通过。
If AntiSpam = A Integer
    If AntiSpam >= 10
        Comment = Approved
    Else
        Comment = Spam
Else
    Comment = Spam
理论是:
- 垃圾邮件机器人将不支持JavaScript,并将提交所看到的内容
- 如果漫游器确实支持JavaScript,它将立即提交表单
- 评论者至少在发布之前阅读了一些页面
这种方法的缺点是它需要JavaScript,并且如果您未启用JavaScript,则您的评论将被标记为垃圾邮件,但是,我确实会检查标记为垃圾邮件的评论,因此这不是问题。
对评论的回应
@MrAnalogy:服务器端方法听起来是个好主意,并且与在JavaScript中进行操作完全相同。好决定。
@AviD:正如我在博客中提到的那样,我知道这种方法很容易受到直接攻击。但是,它可以抵御您的普通垃圾邮件机器人,后者会以其可以找到的任何形式盲目提交垃圾邮件。