小编典典

实用的非基于图像的验证码方法?

all

看起来我们将添加CAPTCHA支持。这是防止机器人、垃圾邮件发送者和其他恶意脚本活动所必需的。我们只希望人类在这里发布或编辑东西!

我们将使用 JavaScript (jQuery) CAPTCHA 作为第一道防线:

http://docs.jquery.com/Tutorials:Safer_Contact_Forms_Without_CAPTCHA

这种方法的优点是, 对于大多数人来说,验证码永远不会可见!

然而,对于禁用 JavaScript 的人,我们仍然需要一个后备,这就是它变得棘手的地方。

为 ASP.NET 编写了一个传统的 CAPTCHA 控件,我们可以重复使用它。

验证码图片

但是,我更喜欢使用文本内容,以避免每次请求在服务器上创建所有这些图像的开销。

我见过像..

  • ASCII 文本验证码:\/\/(_)\/\/
  • 数学谜题:7 减去 3 乘以 2 等于多少?
  • 琐事问题:什么味道更好,蟾蜍还是冰棒?

也许我只是在这里对风车倾斜,但<noscript>如果可能的话,我希望有一个资源密集型、非基于图像的兼容验证码。

想法?


阅读 78

收藏
2022-04-14

共1个答案

小编典典

我开发的一种方法似乎工作得很好(尽管我可能没有像你那样收到那么多评论垃圾邮件),是有一个隐藏字段并用虚假值填充它,例如:

<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:我知道这种方法容易受到直接攻击,正如我在博客中提到的那样。但是,它将防御您的普通垃圾邮件机器人,后者盲目地将垃圾提交到它可以找到的任何形式。

2022-04-14