允许订阅者列表注册,但禁止脚本
Allow subscriber list registration but prevent scripts
我的网站上的用户有一个公开可见的配置文件,他们通过一个简单的HTML表单接受订阅。这些订阅将合并到此用户的电子邮件列表中。
有人可以编写一个脚本,不断地注册电子邮件,以破坏/淹没用户的列表。使用基于IP的速率限制可以缓解这种情况,但如果脚本在分布式环境中运行,则此解决方案不起作用。
我能想到的唯一策略是使用CAPTCHA,但我真的想避免这样做。我还能尝试什么?
您的问题本质上可以归结为"如何在不使用CAPTCHA的情况下区分人类和计算机?"
这确实是一个相当复杂的问题,有很多不同的答案和方法。在下文中,我将尝试列举几个。其中一些想法取自本文(德语)。
就我个人而言,我认为某种CAPTCHA将是一个完美的解决方案。这不是图像中必须是扭曲的文本,你也可以使用逻辑谜题或简单的计算。但使用以下方法,您可以尝试避免CAPTCHA;请记住,这些方法总是比需要用户交互的CAPTCHA更容易绕过。
-
在表单中使用隐藏字段作为蜜罐(
type=hidden
或使用CSS)。如果填写了此字段(或者该字段的值超出了您的预期),则表示您检测到了一个机器人(垃圾邮件机器人通常不执行语义分析,因此他们会填写找到的所有内容)。然而,如果机器人是专门针对你的,或者只是学习字段的名称并避免它,这将无法正确工作。 -
使用JavaScript检查表单提交的速度。当然,人类需要一些时间(至少几秒钟)来填写表格,而机器人的速度要快得多。您还应该检查表单是否在短时间内提交了多次。如果您使用AJAX表单和/或服务器端,这可以通过JavaScript来完成。缺点是(正如您自己提到的),它在分布式系统中不起作用。
-
使用JavaScript检测焦点事件、点击或其他鼠标事件,这些事件表明您正在与人打交道。这个方法在这篇博客文章中有描述(包括一些源代码示例)。
-
检查用户是否使用标准web浏览器;垃圾邮件发送者有时会使用自己编写的程序。您可以检查用户代理字符串,但这很容易操作。特征检测将是另一种可能性。
当然,如果用户禁用了JavaScript,方法2-4将不起作用。在这种情况下,您可以在<noscript>
标签中显示一个常规的CAPTCHA。在任何情况下,您都应该将几种方法结合起来,以获得有效且用户友好的测试。
最后我想到的(在你的具体情况下)是检查输入的电子邮件地址的有效性(不仅在语法上,还检查地址是否真的存在)。这可以通过几种方式来实现(请参阅SO上的这个问题),但没有一种是真正可靠的。因此,你必须再次将不同的方法结合起来,才能可靠地区分人类和机器人。
假设任何开始向你的网站发送垃圾邮件的人专门针对你的网站(而不是随机的垃圾邮件机器人),并会尝试积极解决所有对策,那么唯一的选择就是某种captcha,因为其他任何事情都可以自动避免。
所有防止虚假/垃圾邮件提交的非captcha方法要么通过利用脚本中的缺陷进行自动提交,要么通过分析提交的内容来发挥作用。对于提交的类型,内容分析在这里并不是一个真正的选择。因此,剩下的是各种各样的自动提交预防措施,用于对抗垃圾邮件评论:
- 基于CSS的解决方案(例如:http://wordpress.org/extend/plugins/spam-honeypot/)
- 基于JS的解决方案:隐藏字段由javascript计算的数据填充——如果内容是由不支持java脚本的垃圾邮件脚本这样简单的东西提交的,那么很容易被检测到
如果攻击者知道他们在那里,就有可能绕过这两个目标——例如,当你的网站是一个选定的而不是随机的目标时。
总之:有很多解决方案可以非常成功地阻止随机垃圾邮件提交,但如果有人专门针对你的网站,唯一真正有效的方法就是计算机不擅长的东西——验证码。
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 借助asp.net验证或java脚本对多个文本进行验证
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- Java脚本时间添加
- 不显示带有本地json文件数据的谷歌地图脚本
- JQuery添加元素需要在我的js之前再次添加JQuery脚本
- 从远程脚本获取用户IP
- 如何根据时间运行不同的脚本
- 如何将字符串值从php页面发送到java脚本页面
- 使用谷歌应用程序脚本将服务器端数据表返回到客户端
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- 当脚本由system.js加载时,如何要求('electron')
- HTML标记在脚本标记中工作
- 允许订阅者列表注册,但禁止脚本
- 如果此脚本禁止提交,为什么还要提交此表单
- 在内容脚本得到响应之前,禁止启动上下文菜单
- 如果YouTube剪辑被禁止为用户脚本提供替代
- 为什么内联脚本被禁止(内容安全策略)
- jQuery,禁止在脚本完成之前加载页面
- 禁止脚本匹配url