【问题标题】:How to prevent spam on a form [duplicate]如何防止表单上的垃圾邮件[重复]
【发布时间】:2013-09-27 02:51:13
【问题描述】:

我有一个简单的表单,用户可以使用它来注册他们的电子邮件地址以获取新闻通讯。

我想防止垃圾邮件发送者提交 000 封虚假电子邮件。最好的方法是什么?

我曾考虑将每个 IP 地址的输入数量限制为每小时 60 次,但后来认为任何人只要确定会简单地欺骗他们的 IP 作为攻击的一部分。

有什么想法吗?

*编辑:我正在寻找服务器端解决方案。在这种情况下,用户体验很重要,所以我不想使用验证码,或者要求用户使用令牌进行验证

【问题讨论】:

  • 你怎么知道是假的?
  • 那么,当他们输入电子邮件时,向此人发送一封电子邮件,他们必须点击电子邮件中的链接才能激活它?
  • 设置cookies,将每个请求的唯一ID(=token)设置为表单(=带有令牌的隐藏字段),将表单提交限制到特定域,记住用户代理(=浏览器+版本)(不应在呼叫之间更改),安装蜜罐...即使很烦人...添加验证码或“人类”...可解决的问题,例如什么是 1+3? ...您也可以(至少)尝试通过联系“他们的”服务器来验证输入的电子邮件...您可以选择加入(-out),所以如果电子邮件在 24 小时内没有收到,那就不是有效。
  • @huseyintugrulbuyukisik 我正在考虑在几分钟内从某人正在运行的同一个脚本中获得 000 个注册的场景
  • 训练神经网络查看一些输入(ip、ma​​c 地址、电子邮件成分,甚至电子邮件发送频率模式),并将输出作为 0 或 1 表示垃圾邮件。因为他们可能从不同的地址或不同的时间或不同的(随机)电子邮件进行攻击

标签: javascript php jquery forms spam-prevention


【解决方案1】:

您可以使用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

【讨论】:

    【解决方案2】:

    我在互联网的某个地方发现了一种很棒的技术。我对其进行了增强,现在可以在 www.formspammertrap.com 获得(开源)。

    它使用一些 javascript 来替换表单操作,并且需要实时用户的实际“点击”。

    没有验证码、隐藏字段等;这些可能会暂时起作用,但通常不会长期起作用。

    它是免费的,并且在我放置的任何网站上都可以正常工作。基于 PHP,但也适用于 WordPress(不是插件)。

    【讨论】:

      【解决方案3】:

      你可以这样做,

      function validEmail($email){
          if (filter_var($email, FILTER_VALIDATE_EMAIL)){
              list($user,$domain) = explode('@',$email);
              return checkdnsrr($domain, 'MX');
          } 
          return false;
      }
      

      它可能不会接收每封假电子邮件,但我总是通过向他们发送带有链接的验证电子邮件来验证他们的电子邮件。

      编辑:

      至于表单上的垃圾邮件使用 CSRF,这应该可以防止大多数垃圾邮件(至少根据我的经验)

      【讨论】:

      • 谢谢,两个小问题:你的脚本是做什么的(它会查找 dns 记录吗?),什么是 CSRF?
      • @alias51 嘿,所以它首先检查电子邮件以查看它是否正确,然后将其拆分为用户名和域......例如阿兰 | Google.com,然后它会检查邮件服务器的 Google 的 DNS 设置,并根据结果返回 true 或 false ... CSRF 是一个随机字符串放入会话中,它会更改您访问的每个页面,然后您的页面上有一个隐藏字段论坛并在提交时检查它,这样垃圾邮件机器人首先必须在发布您的表单之前获取该字符串。
      • 你有这个的示例实现吗?
      • @alias51 我倾向于在我的代码中使用一个类,所以我不能把它全部复制出来,但这可以大致了解需要做什么。shiflett.org/articles/cross-site-request-forgeries
      【解决方案4】:

      当用户在栏中键入他们的电子邮件地址时,运行一个脚本,将电子邮件发送到包含链接的指定地址,当他们单击该链接时,它将激活该电子邮件地址以获取新闻通讯。

      【讨论】:

        【解决方案5】:

        您可以使用验证码 - 这对用户来说很糟糕而且很烦人。

        我使用的是一个简单的问题(一条狗有多少日志),然后使用&lt;input type='text' name='email2' value=''&gt; 的输入。然后我在服务器端进行必要的检查。但我不做的一件事是通知该人有问题,即在 email2 文本框中输入的号码无效。

        无论如何,只是一个想法。

        【讨论】:

          【解决方案6】:

          一种常见的方法是,将另一个文本字段添加到form-部分。在您的样式表(不是样式标签!)中,您将其 css 属性设置为 display:none,因为大多数垃圾邮件机器人会填充每个可用的 input 元素,但不会加载外部 .css 文件。 当您的脚本收到请求时,您会检查这个隐藏的文本字段——如果它是空白的,那么您很有可能这不是垃圾邮件。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-04-27
            • 1970-01-01
            • 2014-02-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-31
            • 2013-07-19
            相关资源
            最近更新 更多