【问题标题】:Reduce Form Spam [duplicate]减少表单垃圾邮件[重复]
【发布时间】:2013-12-31 15:20:46
【问题描述】:

我通常只做前端 UI。但是,在我一直在做的一个项目中,我必须制作一个表格。该表格有效,电子邮件通过,但不幸的是,大量垃圾邮件正在通过。我添加了一个验证码输入,但这似乎并没有显着减少垃圾邮件的数量。

经过一些研究,蜜罐似乎是最好的选择。但是,因为我对 php 和 javascript(正在研究这个 :))了解不多,所以我不确定最好的代码是什么或放在哪里。

但是我无法找到有关如何执行此操作的明确指南。

所以我的问题是;有谁知道一个明确的指南,其中包含有关如何制作和实施蜜罐输入(使用服务器端条件代码)的说明?

感谢任何帮助。谢谢。

附:表单是“在灯箱中”,因此可能会影响事物。

【问题讨论】:

  • 您当前的表单字段是什么,您认为这些攻击是自动化的吗?
  • 对不起,但在回答后我发现它已经是一个重复了。
  • @robbmj 攻击几乎肯定是自动化的,具体取决于通过的数量和消息的性质。正在寻找字段的编码或名称(抱歉,如果这有一个明显的答案)?
  • 别担心,我希望您发现 dup 链接是阻止攻击者的有效解决方案。祝你好运。
  • 这里有一大堆方法 => stackoverflow.com/questions/8472/…

标签: javascript php forms spam


【解决方案1】:
<form>
  <input name="not-honeypot" type="text">
  <input name="honeypot" type="text" style="display: none">
</form>

<?php

if (!empty($_POST['honeypot'])) {
    // this is a spam!
}

注意display: none[name=honeypot]。如果您的垃圾邮件发送者足够聪明,不会填写隐藏字段,那么您需要另一种方法来向用户隐藏蜜罐字段。或者根本不隐藏它。

【讨论】:

  • 我发现 javascript 甚至比样式更好,因为它应该比 css 更难检测。此外,“蜜罐”之类的名称可能会自动匹配,因此您需要一个不明显的名称。还是不错的答案+1
  • 您可以使用position: absolute; left: -99999px 而不是display: none
  • 实际上,使用 if (!empty($_POST['honeypot'])) { die(); } 作为第一行(在 &lt;?php 之后)会阻止任何东西到达 mail() 函数。
  • 我想这可能就是我要找的东西,谢谢!
【解决方案2】:

其实很简单。我会凭记忆尝试,所以预计会出现拼写错误。你总是可以用谷歌搜索更可靠的答案,因为我确信那里很少有教程。

html:

<form method = "POST" action = "post.php">
  <input type = "email" name = "email>
  <input type = "email" name = "emailb">
  <input type = "submit">
</form>

Javascript (jquery):

$(document).ready(function(){
  $(".another[attribute='emailb']").hide();
  });

post.php:

<?php
if (!empty($_POST['emailb']))
  throw new Exception("SPAAAAM");

您需要使用 javascript 来完成,因为大多数自动化机器人不会使用它。但是,您还想检查在 X 分钟内从该 IP 发送的表单数量以及其他几个选项以防止更多。注意:不要自动禁用它,将验证码显示为最后一行。

【讨论】:

  • “灯箱”中包含的事实不会影响 javascript 吗?
【解决方案3】:

首先,定义spam 是/可能是:

垃圾邮件可能包括:
1. 大写字符多于小写字符
2. 空格多于文本
3. 非常短的帖子(例如 10 个字符长)

然后,编写代码来处理它

1. if (strlen(preg_replace('![^A-Z]+!', '', $post)) > strlen(preg_replace('![^a-z]+!', '', $post))){
//spam post
}

2. if(!isset($post) || strlen(strip_tags($post))<150){
//too short - spam post
}

3. if (strlen(preg_replace('/\S/', '', $post)) > strlen(preg_replace('/\s+/', '',     $post)))
{
//spam post
}

这不会阻止垃圾邮件,但应该会过滤掉很多垃圾邮件。

【讨论】:

  • 我确定他指的是Spam (wikipedia)
  • 是的,我知道@FranciscoPresencia
  • @FranciscoPresencia 这是一个验证表单服务器端,它比蜜罐工作得更好。永远不要相信客户
猜你喜欢
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 2013-09-27
  • 1970-01-01
相关资源
最近更新 更多