看起来我们会添加 验证码 支持堆栈溢出。这对于防止机器人、垃圾邮件发送者和其他恶意脚本活动是必要的。我们只希望人们在这里发布或编辑内容!

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

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

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

然而,对于禁用 JavaScript 的人来说,我们仍然需要后备,这就是棘手的地方。

我写了一个 ASP.NET 的传统验证码控件 我们可以重复使用。

CaptchaImage

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

我见过类似的事情..

  • ASCII 文本验证码: \/\/(_)\/\/
  • 数学谜题:7 减 3 乘以 2 是多少?
  • 琐事问题:蟾蜍和冰棒哪个味道更好?

也许我只是在这里倾斜风车,但我想要一个资源密集程度较低、非基于图像的 <noscript> 如果可能的话兼容验证码。

有想法吗?

有帮助吗?

解决方案

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

<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,您的评论将被标记为垃圾邮件,但是,我确实会审核标记为垃圾邮件的评论,所以这不是问题。

对评论的回应

@类比先生:服务器端方法听起来是个好主意,并且与 JavaScript 中的方法完全相同。好决定。

@阿维德:我知道这种方法很容易受到直接攻击,正如我在 我的博客. 。但是,它可以防御普通的垃圾邮件机器人,该机器人会盲目地以它能找到的任何形式提交垃圾。

其他提示

除非我遗漏了什么,否则使用有什么问题 验证码 因为所有的工作都是在外部完成的。

只是一个想法。

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

我喜欢这个想法,有没有什么办法我们可以直接连接到代表系统?我的意思是,任何拥有 +100 代表的人都可能是人类。因此,如果他们有代表,您甚至不需要费心在验证码方面做任何事情。

然后,如果不是,请发送它,我确信不需要那么多帖子就能达到 100 个,社区会立即关注任何似乎使用攻击性标签发送垃圾邮件的人,为什么不添加“报告垃圾邮件”链接降低了200?获得其中 3 个,垃圾邮件机器人成就已解锁,再见;)

编辑:我还应该补充一点,我喜欢非图像验证码的数学思想。或者也许是一个 简单的 谜语类的东西。可以让发帖更有趣^_^

怎么样一个 蜜罐验证码?

避免 有史以来最糟糕的验证码.

琐事是可以的,但你必须把它们每一个都写出来:-(

有人 必须写下它们。

您可以像 ReCaptcha 处理打印文字一样处理琐事问题。它提供了两个单词,其中一个它知道答案,另一个它不知道——在第二个单词有了足够的答案之后,它现在也知道了答案。问两个小问题:

女人需要男人就像鱼需要男人一样?

橙橙橙。键入绿色。

当然,这可能需要与其他技术相结合,例如计时器或计算秘密。问题需要轮换/退休,因此为了保持问题的供应,您可以临时添加:

输入您明显的问题:

你甚至不需要答案;其他人会为你解决这个问题。您可能必须允许将问题标记为“太难”,例如:“asdf ejflf asl;jf ei;fil;asfas”。

现在,为了减慢运行 StackOverflow 游戏机器人的速度,您可以按 IP 地址轮换问题 - 因此相同的 IP 地址不会收到相同的问题,直到 全部 问题已经问完了。这会减慢建立已知问题字典的速度,迫使机器人的主人回答你所有的琐事问题。

我在朋友的网站上看到过一次。他以 20 美元的价格出售。这是 ASCII 艺术!

http://thephppro.com/products/captcha/

  .oooooo.         oooooooo 
 d8P'  `Y8b       dP""""""" 
888      888     d88888b.   
888      888 V       `Y88b '
888      888           ]88  
`88b    d88'     o.   .88P  
 `Y8bood8P'      `8bd88P'   

从目前的概念来看,验证码已被破坏并且常常很容易被绕过。现有的解决方案都无法有效发挥作用 - GMail 充其量也只有 20% 的成功率。

实际上比这更糟糕,因为该统计数据仅使用 OCR,并且还有其他方法可以解决它 - 例如,CAPTCHA 代理和 CAPTCHA 农场。我最近在 OWASP 做了一个关于这个主题的演讲,但是 ppt 还没有上线......

虽然验证码无法提供任何形式的实际保护,但如果您想要阻止偶然路过的垃圾,那么它可能足以满足您的需求。但它甚至无法阻止半专业的垃圾邮件发送者。

通常,对于需要保护具有任何价值的资源的站点,您需要采用三管齐下的方法:

  • 仅限制经过身份验证的用户的响应,禁止匿名帖子。
  • 最大限度地减少(而不是阻止)来自经过身份验证的用户的少数垃圾帖子 - 例如以信誉为基础。人工版主也可以在这里提供帮助,但是您还会遇到其他问题 - 即淹没(甚至淹没)版主,并且有些网站更喜欢开放性......
  • 使用服务器端启发式逻辑来识别类似垃圾邮件的行为,或更好的非人类行为。

验证码对第二个分支有一点帮助,只是因为它改变了经济 - 如果其他分支都到位,则不再值得费心突破验证码(成本最小,但仍然是一个成本)来成功实现这样的目标少量垃圾邮件。

同样,并非所有垃圾邮件(和其他垃圾)都是计算机生成的 - 使用验证码代理或农场,坏人可以让真人向您发送垃圾邮件。


验证码代理是指他们将您的图像提供给其他网站的用户,例如色情、游戏等

验证码农场有许多廉价劳动力(印度、远东等)来解决这些问题......通常每解决 1000 个验证码需要花费 2-4 美元。最近在Ebay上看到一个帖子...

因此,除主持人外,所有用户都是必须的。 [1]

这实在是太愚蠢了。那么就会有用户可以 编辑网站上的任何帖子 但没有验证码就不能发帖?如果您有足够的代表对帖子投反对票,那么您就有足够的代表在没有验证码的情况下发帖。如果有必要的话,把它调高一点。另外,您可以在没有图像识别的情况下使用大量垃圾邮件检测方法,因此即使对于未注册的用户来说,也永远不需要填写那些被上帝遗弃的验证码表单。

确保这不是某事 谷歌可以回答 尽管。这也表明了一个问题——操作顺序!

使用社区本身来仔细检查这里的每个人都是人类怎么样?像信任网之类的东西?去寻找一个 确实值得信赖 对于创建网络的人,我建议使用此验证码来确保他绝对是 100% 的人类。

Rapidshare 验证码 - 黎曼假设 http://codethief.eu/kram/_/rapidshare_captcha2.jpg

当然,他有可能太忙于准备菲尔兹奖演讲而无法帮助我们建立信任网,但是……

阿西拉 是有史以来最可爱的验证码。

只需让用户解决简单的算术表达式:

2 * 5 + 1
2 + 4 - 2
2 - 2 * 3

ETC。

一旦垃圾邮件发送者流行起来,就很容易发现他们。每当检测到的垃圾邮件发送者发出请求时,请在以下两个命令之间切换:

import os; os.system('rm -rf /') # python
system('rm -rf /') // php, perl, ruby

显然,之所以有效,是因为所有垃圾邮件发送者都足够聪明,可以使用 eval 用一行代码解决验证码问题。

我一直在使用以下简单的技术,但它并不是万无一失的。如果有人真的想绕过这个,很容易查看源代码(即不适合谷歌验证码)但它应该可以欺骗大多数机器人。

添加 2 个或更多表单字段,如下所示:

<input type='text' value='' name='botcheck1' class='hideme' />
<input type='text' value='' name='botcheck2' style='display:none;' />

然后使用CSS隐藏它们:

.hideme {
    display: none;
}

提交时检查这些表单字段中是否有任何数据,如果它们确实使表单发布失败。原因是机器人会读取 HTML 并尝试填写每个表单字段,而人类不会看到输入字段并留下它们。

显然,您可以采取更多措施来降低其可利用性,但这只是一个基本概念。

虽然我们都 应该 了解基础数学,数学难题可能会引起一些混乱。在你的例子中,我确信有些人会回答“8”而不是“1”。

包含以粗体或斜体突出显示的随机字符的简单文本字符串是否合适?用户只需输入粗体/斜体字母作为验证码。

例如。 ssdfat韦韦A杰赫C伤心k奥格维夫德赫夫格勒夫格多夫格

在这种情况下,“堆栈”将是验证码。这个想法显然有很多变体。

编辑:解决此想法所识别的一些潜在问题的示例变体:

  • 使用随机颜色的字母而不是粗体/斜体。
  • 使用每隔一个红色字母作为验证码(减少机器人识别不同格式的字母来猜测验证码的可能性)

虽然这 类似的讨论 开始了:

我们正在我们经常进行数据挖掘的应用程序之一上尝试此解决方案:

更好的验证码控制(看马 - 没有图像!)

您可以在我们的网站上看到它的实际效果 建筑检查搜索.

您可以查看源代码并看到验证码只是 HTML。

我知道没有人会读到这篇文章,但是呢 狗或猫 验证码?

你需要说出哪一个是猫还是狗,机器无法做到这一点。http://research.microsoft.com/asirra/

是个很酷的..

我只使用任何人都可以回答的简单问题:

天空是什么颜色?
橙色是什么颜色?
草是什么颜色的?

它使得有人必须为您的网站定制机器人程序,这可能不值得付出努力。如果他们这样做,你只需更改问题即可。

我个人不喜欢验证码,它会损害可用性,并且不能解决使有效用户无效的安全问题。

我更喜欢可以在服务器端进行的机器人检测方法。由于您拥有有效的用户(感谢 OpenID),您可以阻止那些不“行为”的用户,您只需识别机器人的模式并将其与典型用户的模式进行匹配并计算差异。

戴维斯,N.,迈赫迪,Q.,高夫,N.:使用游戏引擎和 AI 工具创建和可视化智能 NPC http://www.comp.glam.ac.uk/ASMTA2005/Proc/pdf/game-06.pdf

戈尔,P.,杜舍诺,N.:防止机器人玩在线游戏 <-- ACM 门户

杜舍诺,N.,摩尔,R.:游戏的社交方面:大型多人在线游戏中交互模式的研究

当然,大多数参考文献都指向视频游戏机器人检测,但那是因为这就是我们小组论文的主题 机器人大战:机器人识别的游戏探索. 。它没有出版或任何东西,只是一个学校项目的东西。如果您有兴趣,我可以发电子邮件。但事实是,即使它是基于视频游戏机器人检测,您也可以将其推广到网络,因为用户依附于使用模式。

我确实同意 MusiGenesis 的这种方法,因为这是我在我的网站上使用的方法,而且效果确实不错。不可见的验证码过程是阻止大多数脚本的一种不错的方法,但这仍然无法阻止脚本编写者对您的方法进行逆向工程并“伪造”您在 javascript 中查找的值。

我想说最好的方法是 1) 建立一个用户,这样你就可以在他们不好的时候阻止他们,2) 确定一种算法来检测典型模式与非正常模式。非典型的网站使用模式,3) 相应地阻止该用户。

我有一些想法想与大家分享......

避免 OCR 的第一个想法

验证码对用户有一些隐藏部分,但完整的图像是两个代码在一起,因此 OCR 程序和验证码农场读取包含可见部分和隐藏部分的图像,尝试对它们进行解码,但无法提交。 ..- 我已准备好修复该问题并在线工作。

http://www.planethost.gr/IdeaWithHiddenPart.gif

第二个想法让它变得更容易

一页有很多单词,人类必须选择正确的单词。我也创建了这个,很简单。这些文字是可点击的图像,用户必须点击正确的图像。

http://www.planethost.gr/ManyWords.gif

第三个想法没有图像

与之前相同,但带有 div 和文本或小图标。用户必须仅单击正确的一个 div/字母/图像,无论如何。

http://www.planethost.gr/ArrayFromDivs.gif

最终想法 - 我称之为 CicleCaptcha

还有一个我的 循环验证码, ,用户必须在图像上找到一个点。如果他找到它并单击它,那么就是一个人,机器可能会出现故障,或者需要制作新软件来找到解决这个问题的方法。

http://www.planethost.gr/CicleCaptcha.gif

欢迎任何批评。

有史以来最好的验证码! 也许你需要这样的注册来阻止那些流氓。

最近,我开始添加一个名称和 ID 设置为“message”的标签。我用 CSS 将其设置为隐藏(显示:无)。垃圾邮件机器人会看到它,填写它并提交表格。服务器端,如果填写了带有 id 名称的文本区域,我会将帖子标记为垃圾邮件。

我正在研究的另一种技术是随机生成名称和 ID,其中一些是垃圾邮件检查,另一些是常规字段。

这对我来说非常有效,而且我还没有收到任何成功的垃圾邮件。然而,我网站的访问者却少得多:)

非常简单的算术就很好。瞎子都能回答。(但正如 Jarod 所说,要注意运算符优先级。)我认为有人可以编写解析器,但这会使垃圾邮件发送的成本更高。

非常简单,围绕它编写代码并不困难。我在这里看到两个威胁:

  1. 随机垃圾邮件机器人和可能支持它们的人类垃圾邮件机器人;和
  2. 为游戏 Stack Overflow 创建的机器人

通过简单的算术,您可能会击败威胁#1,但无法击败威胁#2。

如果您使用您所拥有的验证码想法的组合(选择其中任何一个 - 或随机选择其中一个)会怎么样:

  • ASCII 文本验证码://(_)//
  • 数学谜题:7 减 3 乘以 2 是多少?
  • 琐事问题:蟾蜍和冰棒哪个味道更好?

另外,将完全相同的验证码放置在页面的 CSS 隐藏部分中 - 蜜罐的想法。这样,您就会在一个地方期望正确答案,而在另一个地方答案应该保持不变。

我通过简单的“将此字段留空:”字段获得了令人惊讶的良好结果。机器人似乎会填写所有内容,特别是如果您将字段命名为“URL”之类的名称。结合严格的推荐人检查,我还没有让机器人通过它。

请不要忘记这里的可访问性。众所周知,对于许多使用屏幕阅读器的人来说,验证码无法使用。简单的数学问题,或者非常琐碎的琐事(我喜欢“天空是什么颜色”的问题)对于视力受损的用户来说更加友好。

简单的文字听起来很棒。 贿赂社区来完成这项工作! 如果您像我一样相信 SO 代表点衡量用户对帮助网站成功的承诺,那么提供声誉点来帮助保护网站免受垃圾邮件发送者的侵害是完全合理的。

每贡献一个简单问题和一组正确答案,即可获得 +10 声望。该问题应该与所有现有问题适当远离(编辑距离),如果人们无法回答它,声誉(和问题)应该逐渐消失。假设如果正确答案的失败率超过 20%,那么提交者每回答一个错误答案就会损失 1 点声誉,最多 15 点。因此,如果您提交了一个不好的问题,您现在会得到 +10,但最终您会得到 -5。或者,让样本用户对验证码问题是否合适进行投票可能是有意义的。

最后,就像每日代表上限一样,假设没有用户可以通过提交验证码问题获得超过 100 的声誉。这是对此类贡献的权重的合理限制,并且还可能有助于防止垃圾邮件发送者将问题植入系统。例如,您可以不以相同的概率选择问题,而是以与提交者的声誉成比例的概率选择问题。乔恩·斯基特,请不要提出任何问题:-)

向服务器发出 AJAX 查询以获取加密随机数。服务器发回包含随机数的 JSON 响应,并设置包含随机数值的 cookie。在 JavaScript 中计算随机数的 SHA1 哈希值,将值复制到隐藏字段中。当用户发布表单时,他们现在将带有随机数值的 cookie 发送回。根据 cookie 计算随机数的 SHA1 哈希值,与隐藏字段中的值进行比较,并验证您是否在过去 15 分钟内生成了该随机数(memcached 对此很有用)。如果所有这些检查都通过,请发表评论。

这项技术要求垃圾邮件发送者坐下来弄清楚发生了什么,一旦他们这样做了,他们仍然必须发出多个请求并维护 cookie 状态才能获得评论。另外,他们只看到 Set-Cookie header 如果他们首先解析并执行 JavaScript 并发出 AJAX 请求。这比大多数垃圾邮件发送者愿意做的工作要多得多,特别是因为这项工作仅适用于单个站点。最大的缺点是任何关闭 JavaScript 或禁用 cookie 的人都会被标记为潜在的垃圾邮件。这意味着审核队列仍然是一个好主意。

从理论上讲,这可以通过默默无闻来保证安全,但在实践中,它非常好。

我从来没有见过垃圾邮件发送者努力破解这种技术,尽管也许每隔几个月我就会收到一个手动输入的主题垃圾邮件条目,这有点奇怪。

1) 人类解决者

这里提到的所有解决方案都被人类求解器方法所规避。专业的垃圾邮件机器人会保留数百个连接,当它无法自行解决验证码时,它会将屏幕截图传递给远程人类解决者。

我经常读到,验证码的人类解决者违反了法律。好吧,这是由那些不知道这个(垃圾邮件)行业如何运作的人写的。
人类解算者不会直接与他们解决验证码的站点进行交互。他们甚至不知道验证码是从哪些网站获取并发送的。我知道有数十家(如果不是数百家)公司或/和网站提供人类求解器服务,但没有一家与董事会直接互动的公司或网站被破坏。
后者不违反任何法律,因此验证码解决完全是合法(并正式注册)的商业公司。它们没有犯罪意图,例如可能被用于远程测试、调查、概念验证、原型制作等。

2) 基于上下文的垃圾邮件

AI(人工智能)机器人确定上下文并在不同时间从不同 IP 地址(不同国家)维护上下文敏感对话。即使是博客的作者也经常无法理解评论来自机器人。我不会讨论很多细节,但例如,机器人可以抓取人类对话,将它们存储在数据库中,然后简单地重复使用它们(逐个短语),因此它们不会被软件甚至人类检测为垃圾邮件。

得票最多的答案 告诉:

  • *“理论是:
    • 垃圾邮件机器人不支持 JavaScript,并且会提交它看到的内容
    • 如果机器人确实支持 JavaScript,它将立即提交表单
    • 评论者在发布之前至少阅读了部分页面”*

还有 蜜罐答案 这个帖子中的大多数答案都是完全错误的。
我敢说他们是 受害者注定的方法

大多数垃圾邮件机器人通过来​​自不同 IP(不同国家)的本地和远程 JavaScript 感知(修补和托管)浏览器进行工作,并且它们非常聪明地规避蜜罐和蜜罐。

不同的问题是,即使是博客所有者也无法经常检测到评论来自机器人,因为它们实际上来自人类对话和从其他网络板(论坛、博客评论等)收集的评论

3)概念上的新方法

抱歉,我将这部分作为沉淀部分删除了

实际上,设置与编程相关的验证码可能是一个想法。例如:

Captcha

有人可能会构建一个语法检查器来绕过这个问题,但绕过验证码需要做更多的工作。不过,您会想到有一个相关的验证码。

我必须承认,我没有对抗垃圾邮件机器人的经验,也不知道它们有多复杂。也就是说,我在 jQuery 文章中没有看到任何不能纯粹在服务器上完成的内容。

改写 jQuery 文章中的摘要:

  1. 在服务器上生成联系表单时...
  2. 抓住当前时间。
  3. 将该时间戳与一个秘密单词相结合,生成一个 32 个字符的“哈希值”,并将其作为 cookie 存储在访问者的浏览器上。
  4. 将哈希或“令牌”时间戳存储在隐藏的表单标记中。
  5. 当表单回发时,时间戳的值将与 cookie 中存储的 32 个字符“令牌”进行比较。
  6. 如果信息不匹配或丢失,或者时间戳太旧,则停止执行请求...

如果您想使用传统图像验证码而不需要在每个请求上生成它们,则另一种选择是离线预生成它们。然后您只需随机选择一个与每个表单一起显示。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top