允许订阅者列表注册,但禁止脚本

Allow subscriber list registration but prevent scripts

本文关键字:禁止 脚本 注册 许订阅 列表      更新时间:2023-10-29

我的网站上的用户有一个公开可见的配置文件,他们通过一个简单的HTML表单接受订阅。这些订阅将合并到此用户的电子邮件列表中。

有人可以编写一个脚本,不断地注册电子邮件,以破坏/淹没用户的列表。使用基于IP的速率限制可以缓解这种情况,但如果脚本在分布式环境中运行,则此解决方案不起作用。

我能想到的唯一策略是使用CAPTCHA,但我真的想避免这样做。我还能尝试什么?

您的问题本质上可以归结为"如何在不使用CAPTCHA的情况下区分人类和计算机?"

这确实是一个相当复杂的问题,有很多不同的答案和方法。在下文中,我将尝试列举几个。其中一些想法取自本文(德语)。

就我个人而言,我认为某种CAPTCHA将是一个完美的解决方案。这不是图像中必须是扭曲的文本,你也可以使用逻辑谜题或简单的计算。但使用以下方法,您可以尝试避免CAPTCHA;请记住,这些方法总是比需要用户交互的CAPTCHA更容易绕过。

  1. 在表单中使用隐藏字段作为蜜罐(type=hidden或使用CSS)。如果填写了此字段(或者该字段的值超出了您的预期),则表示您检测到了一个机器人(垃圾邮件机器人通常不执行语义分析,因此他们会填写找到的所有内容)。然而,如果机器人是专门针对你的,或者只是学习字段的名称并避免它,这将无法正确工作。

  2. 使用JavaScript检查表单提交的速度。当然,人类需要一些时间(至少几秒钟)来填写表格,而机器人的速度要快得多。您还应该检查表单是否在短时间内提交了多次。如果您使用AJAX表单和/或服务器端,这可以通过JavaScript来完成。缺点是(正如您自己提到的),它在分布式系统中不起作用。

  3. 使用JavaScript检测焦点事件、点击或其他鼠标事件,这些事件表明您正在与人打交道。这个方法在这篇博客文章中有描述(包括一些源代码示例)。

  4. 检查用户是否使用标准web浏览器;垃圾邮件发送者有时会使用自己编写的程序。您可以检查用户代理字符串,但这很容易操作。特征检测将是另一种可能性。

当然,如果用户禁用了JavaScript,方法2-4将不起作用。在这种情况下,您可以在<noscript>标签中显示一个常规的CAPTCHA。在任何情况下,您都应该将几种方法结合起来,以获得有效且用户友好的测试。

最后我想到的(在你的具体情况下)是检查输入的电子邮件地址的有效性(不仅在语法上,还检查地址是否真的存在)。这可以通过几种方式来实现(请参阅SO上的这个问题),但没有一种是真正可靠的。因此,你必须再次将不同的方法结合起来,才能可靠地区分人类和机器人。

假设任何开始向你的网站发送垃圾邮件的人专门针对你的网站(而不是随机的垃圾邮件机器人),并会尝试积极解决所有对策,那么唯一的选择就是某种captcha,因为其他任何事情都可以自动避免。

所有防止虚假/垃圾邮件提交的非captcha方法要么通过利用脚本中的缺陷进行自动提交,要么通过分析提交的内容来发挥作用。对于提交的类型,内容分析在这里并不是一个真正的选择。因此,剩下的是各种各样的自动提交预防措施,用于对抗垃圾邮件评论:

  • 基于CSS的解决方案(例如:http://wordpress.org/extend/plugins/spam-honeypot/)
  • 基于JS的解决方案:隐藏字段由javascript计算的数据填充——如果内容是由不支持java脚本的垃圾邮件脚本这样简单的东西提交的,那么很容易被检测到

如果攻击者知道他们在那里,就有可能绕过这两个目标——例如,当你的网站是一个选定的而不是随机的目标时。

总之:有很多解决方案可以非常成功地阻止随机垃圾邮件提交,但如果有人专门针对你的网站,唯一真正有效的方法就是计算机不擅长的东西——验证码。