2012-07-18 70 views
1

我的网站上的用户有一个公开可见的个人资料,他们通过简单的HTML表单接受订阅。这些订阅将合并到此用户的电子邮件列表中。允许订阅者列表注册但阻止脚本

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

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

+0

我完全不明白你有什么问题,有太多的用户订阅列表还是什么? – 2012-08-07 21:58:09

+0

如何让用户通过简单的html表单“接受”订阅请求? 对于用户,那么你可以通过他们的ip将订阅请求分组,并以不同的方式显示它们。这样用户会知道他们是否是假的。 这是一种方法。 – Prasanth 2012-08-07 21:58:32

+0

@ OlegV.Volkov问题是有一个恶意脚本订阅100k假电子邮件列表,导致列表变得无用。 – Harper 2012-08-07 23:00:17

回答

1

你的问题基本归结为“如何在不使用CAPTCHA的情况下将人类和计算机分开?”

这确实是一个相当复杂的问题,有很多不同的答案和方法。在下面我会试着举几个例子。其中一些想法取自this article (German)

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

  1. 在窗体中使用隐藏字段作为蜜罐(type=hidden或使用CSS)。如果填写了这个字段(或者有其他的值),那么你已经发现了一个bot(垃圾邮件机器人通常不会执行语义分析,因此他们填写了他们找到的所有内容)。然而,如果机器人专门针对你,或者只是了解该领域的名称并避免它,这将无法正确工作。

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

  3. 使用JavaScript检测焦点事件,点击或其他鼠标事件,表明您正在处理人类。该方法在this blog article(包括一些源代码示例)中进行了描述。

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

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

最后我想到的是(在你的具体情况下)是检查输入的电子邮件地址的有效性(不仅在语法上,而且还检查地址是否真的存在)。这可以通过几种方式完成(请参阅此question on SO),但它们都不是真的可靠。所以,再次,你将不得不结合不同的方法,以便可靠地告诉人类和机器人分开。

+0

+1和赏金。谢谢你的回答 – Harper 2012-08-10 04:04:38

1

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

防止假冒/垃圾邮件提交的所有非验证码的方法通过利用漏洞脚本做自动提交或提交的分析内容工作,要么。对于提交内容类型,内容分析在这里不是真正的选择。那么剩下的就是各种各样的战斗中使用,例如垃圾评论的自动提交预防:

  • 基于CSS的解决方案(比如这个:http://wordpress.org/extend/plugins/spam-honeypot/
  • JS基础的解决方案:隐藏字段由数据填充由JavaScript计算 - 如果内容被作为垃圾邮件脚本一样简单的东西,不支持Java脚本它很容易检测到的提交

这是可能的工作,这两个绕如果攻击者知道他们在那里 - 例如当您的网站是一个选定的,而不是随机的目标。

总结:有很多解决方案可以很好地阻止随机垃圾邮件的提交,但是如果有人专门针对您的网站,唯一真正有效的方法就是电脑不好 - CAPTCHA。

+0

+1 - 谢谢你的回答。 – Harper 2012-08-10 04:04:56