我有一个简单的表格,用户可以使用它来注册他们的电子邮件地址以获取新闻通讯。
我想防止垃圾邮件发送者提交 000 封假电子邮件。最好的方法是什么?
我曾考虑将每个 IP 地址的输入数量限制为每小时 60 次,但后来认为任何人只要确定将欺骗他们的 IP 作为攻击的一部分。
有任何想法吗?
*编辑:我正在寻找服务器端解决方案。在这种情况下,用户体验很重要,所以我不想使用验证码,或者要求用户使用令牌进行验证
我有一个简单的表格,用户可以使用它来注册他们的电子邮件地址以获取新闻通讯。
我想防止垃圾邮件发送者提交 000 封假电子邮件。最好的方法是什么?
我曾考虑将每个 IP 地址的输入数量限制为每小时 60 次,但后来认为任何人只要确定将欺骗他们的 IP 作为攻击的一部分。
有任何想法吗?
*编辑:我正在寻找服务器端解决方案。在这种情况下,用户体验很重要,所以我不想使用验证码,或者要求用户使用令牌进行验证
你可以使用negative captcha
. 想法是有一个人类不可见的表单字段,但机器人会在其中输入值。在服务器端,您可以忽略在负验证码字段中有值的请求。
优点是普通用户看不到任何额外的步骤,例如输入验证码或验证电子邮件。缺点是只要人们不会专门为您的网站定制机器人,该方法就可以工作。
否定验证码的示例。将此包含在您的表格中。
<div style="position: absolute; left:-2000px;"><input type="text" name="email_name" value="" /></div>
在服务器端做类似的事情
if (params[:email_name] != "") //bot
else //not a bot
我在互联网的某个地方发现了一种很棒的技术。我对其进行了增强,现在可以在 www.formspammertrap.com 获得(开源)。
它使用一些 javascript 来替换表单操作,并且需要实时用户的实际“点击”。
没有验证码、隐藏字段等;这些可能会暂时起作用,但通常不会长期起作用。
它是免费的,并且在我放置的任何网站上都非常有效。基于 PHP,但也适用于 WordPress(不是插件)。
你可以做这样的事情,
function validEmail($email){
if (filter_var($email, FILTER_VALIDATE_EMAIL)){
list($user,$domain) = explode('@',$email);
return checkdnsrr($domain, 'MX');
}
return false;
}
它可能不会收到每封假电子邮件,但我总是通过向他们发送带有链接的验证电子邮件来验证他们的电子邮件。
编辑:
至于表单上的垃圾邮件使用 CSRF,这应该可以防止大多数垃圾邮件(至少根据我的经验)
当用户在栏中键入他们的电子邮件地址时,运行一个脚本,将电子邮件发送到包含链接的指定地址,当他们单击该链接时,它将激活该电子邮件地址以获取新闻通讯。
你可以使用 capthcha - 这对用户来说很糟糕而且很烦人。
我使用的是一个简单的问题(一条狗有多少日志),然后使用<input type='text' name='email2' value=''>
. 然后我在服务器端进行必要的检查。但我不做的一件事是通知该人有问题,即在 email2 文本框中输入的号码无效。
无论如何,只是一个想法。
一种常见的方法是,将另一个文本字段添加到form
-section。在您的样式表(不是样式标签!)中,您将其 css-property 设置为display:none
,因为大多数垃圾邮件机器人会填充每个可用的input
元素,但不会加载外部 .css 文件。当你的脚本收到请求时,你检查这个隐藏的文本字段——如果它是空白的,你很有可能这不是垃圾邮件。