如何在没有CAPTCHA或中央管理系统(例如akismet)的情况下防止垃圾邮件

时间:2009-08-18 21:39:59

标签: captcha spam-prevention

是否有人能够成功阻止其网站上的垃圾邮件,而不会给访问者带来负担(例如CAPTCHA),也不会使用集中式垃圾邮件报告系统(例如Akismet)

我找到了this & it looks promising, but doesn't contain detailed deployment instructions.

我想展示我的网络表单,而不会给我的用户增加像CAPTCHA这样的技术,但也会主动自动防止垃圾邮件。

似乎没有关于如何实施这种技术的详细说明/教程。

声明

此外,我意识到没有适合防止垃圾邮件的银弹。但是,如果简单地建立一个阻止95%以上垃圾邮件的非侵入性(用户不可见)预防系统,那么部署的努力是值得的。

10 个答案:

答案 0 :(得分:6)

我基本上在我的网站上使用一个技巧来防止垃圾邮件,它的效果很好(至少在spambot程序员阅读这篇文章之前;)。

代码是这样的:

在构建包含表单的站点的脚本中,我实现了:

$_SESSION['lastSiteId'] = 'something Unique';
$_SESSION['lastSiteRequest'] = time();

包含将注释写入数据库的逻辑的脚本包含:

if($_SESSION['lastSiteId'] == 'something Unique' 
   && $_SESSION['lastSiteRequest'] + 5 < time()){

    insertComment();
}else{
    echo "Please read the article before posting a comment";
}

请记住这是伪代码给你的想法。你必须最终单独实现它;;)

所有这一切都是检查在重新表单和发送POST请求之间是否超过5秒。

警告说,spambot工程师没有睡觉。投注是,如果程序员想要那样,垃圾邮件程序可以在发布不需要的输入之前等待几秒钟。 问题是:如果垃圾邮件发送者必须在请求之间等待5秒,可以发送多少垃圾邮件?看,这可能是垃圾邮件预防的最终解决方案。

将时间测试与javascript测试(如果可能和想要)以及预填充/未填充的隐藏字段技巧相结合,您应该在几年后从垃圾邮件中保存。

答案 1 :(得分:3)

Honey Pot验证码(article by Phil Haack)。是否采用通常的方法来做你想要的。这不是万无一失的,但真的是什么?

这似乎是你已经探索过的。只要尽职尽责地了解解决方案的局限性,如果您仍然发现它符合您的需求,请确保此技术已被其他人好好使用。

答案 2 :(得分:1)

如果有最终解决方案,则根本不需要CAPTCHA。但是,如果您的站点大小不足以保证有人手动寻找破解方法,那么通过默默无闻的安全性可能是最好的方法。例如您在上面提供的链接,或者像添加名为“City_2”之类的输入并将其隐藏起来一样简单。如果填写了输入框,很可能你有一个垃圾邮件发送者,因为他们会自动填写每个字段 - 只是转储数据并继续前进......只需我2美分。

答案 3 :(得分:1)

摆脱99%的垃圾邮件,请参阅此内容 - http://wordpress-plugins.feifei.us/hashcash/

显然,它只会阻止自动垃圾邮件,与Akismet或其他产品一起使用,并获得100%的保护。

更新:HashCash如何运作? 垃圾邮件不需要任何费用(它可以免费使用僵尸网络),这就是它的工作原理。因此,我们的想法是,如果这个过程(CPU)成本高昂,那么批量垃圾邮件/消息传递将无法正常工作。更多细节在这里 - http://en.wikipedia.org/wiki/Hashcash

可以使用JavaScript实现更简单的版本。在提交表单之前,脚本将生成计算值。这个过程必须是CPU昂贵的。大多数僵尸网络都会避免这样做,因此没有自动垃圾邮件。

答案 4 :(得分:1)

我最近尝试过一种非常简单的技巧。我注意到,当出现一组单选按钮时,垃圾邮件机器人似乎总是选择第一个选项或接受预先检查的内容。因此,在我运行的一个网站上,我有一个表格,用户填写可能有六个问题。其中一个问题是“输入类型”,带有用于选择的单选按钮。所以我添加了一个新的第一选择,“我是一个垃圾邮件发送者”,用一个括号内的注释解释了为什么选择存在,并将其作为默认值。如果在选中该选项的情况下提交表单,则会返回错误消息而不是通常的确认消息。自那以后,我收到的垃圾邮件数量几乎没有下降。我不知道剩下的是垃圾邮件机器人采取不同的策略 - 可能随机选择可用的单选按钮 - 或者它是人类垃圾邮件发送者而不是机器人。

大多数情况下,我做了一个实验,看看它是否会起作用 - 坦率地说,欺骗垃圾邮件机器人简单地忏悔并自我介入是很有趣的!大多数情况下,我提出来讨论:也许这会有助于更好的想法。

如果一个垃圾邮件发送者认为我的小网站值得他们特别关注,他们可以通过一个稍微聪明的垃圾邮件机器人轻松击败它。但这可以说是许多反垃圾邮件计划。

答案 5 :(得分:0)

This是一个非常好的工作解决方案,我在我的项目中使用它。

值得一试......

答案 6 :(得分:0)

我使用Akismet,它实际上与电子邮件垃圾邮件过滤器非常相似,但功能非常强大,因为它使用该服务每个站点的组合垃圾邮件不断构建贝叶斯配置文件(每天约1800万条评论) )。他们的网络服务非常简单,速度非常快 - 只需通过网络发送评论,他们就会发回“垃圾邮件”或“非垃圾邮件”回复。几乎每个平台都有existing Akismet libraries

在我的网站上,如果评论通过,我会把它放在数据库中,否则我只是默默地忽略它。

答案 7 :(得分:0)

关于任何反垃圾邮件系统的一般评论:您所做的一切都不会是100%安全的。如果你的网站足够大或有足够的回报,垃圾邮件发送者决定特别注意打破它,他们可能会找到一种方法。但就像他们经常谈论家庭安全一样:当然,熟练的,专业的小偷可以击败普通房主可能负担得起的任何警报系统。但是你会把笨拙的业余爱好者排除在外,如果你给专业人士带来足够的麻烦,你就增加了他的风险,当他打破它时,你会回到家里或者邻居会看到他并打电话给他警察。当我为军队工作时,我们经常谈论安全与防止合法用户完成工作之间的平衡。军队的目标不是一些假设的“绝对安全”,而是足以将风险降低到“可接受水平”的东西,这对于授权人员的最小不便是一致的。显然,什么构成“可接受”取决于你所保护的东西:我当然希望保护核弹头的人坚持比我们放在雷达系统周围更高的安全水平。怀疑地区的人们,比如中东的基地,比我们在美洲中部的基地有更高的安全性。等

重点是:目标是您的网站的可能性有多大?我当然希望我的银行使用更严格的安全来保护我的钱,而不是在我运行的会议网站上用来防止垃圾邮件抽象提交。拥有数百万访问者并且众所周知的网站可能需要比拥有数千或数百访问者的模糊网站更好的安全性。 “足够好”多少钱?

答案 8 :(得分:0)

在您的表单(评论或联系表单)中,您应添加隐藏的输入

<input type="text" id="hidden_input" name="hidden_input" style="display:none;"/>

并写一个小PHP来检查这个输入是否已填满,所以选择&#39; if if else else&#39;你可以控制

if($_POST['hidden_input'] != ""){
    echo('<p>You are a spambot!!!</p>');    
}

这是因为人们可以&#39;看到这个表格,所以可以&#39;由我们填补。通过这种方式,确实机器人填充了每个输入,所以如果每个输入都是填充PHP发送此错误消息,它就会这样做。 t发送到服务器的评论或电子邮件,

答案 9 :(得分:0)

向用户询问一个简单的随机数学问题。如果他们解决了,他们会看到“提交”按钮。否则,他们不会。这同样适用于静态网站。

这是问题输入组

<div class="input-group">
  <input type="text" value="" id="testInput" class="form-control">
  <span class="input-group-btn">
  <button class="btn btn-default" type="button" id="mathTest">Go!</button>
</span>
</div>

这是生成并验证问题的脚本。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript" src="https://ajax.microsoft.com/ajax/jquery.validate/1.7/jquery.validate.js"></script>

< script > jQuery(function($) {
    $("#wj-form").validate();
    var rnuma = Math.floor(Math.random() * 11);
    var rnumb = Math.floor(Math.random() * 11);
    var sum = rnuma + rnumb;
    $("#rnuma").text(rnuma);
    $("#rnumb").text(rnumb);
    $("#mathTest").click(function() {
        if (sum == $("#testInput").val()) {
            $("#wj-form").append('<div class="form-group"><input type="submit" value="Send Message" class="btn btn-primary"></div>');
        } else {
            alert('Sorry, please try again.');
        }
    });
}); < /script>

上面的脚本正是这样做的。确保您没有在表单中放置“提交”按钮。仅在解决问题后才应附加该文件。我已经实现了此here。确保使用脚本中提到的正确格式id

尽管有一个警告。如果用户没有在其浏览器上运行的javascript,则该技巧将不起作用。