如何在没有验证码或集中管理系统(例如 akismet)的情况下防止垃圾邮件
Posted
技术标签:
【中文标题】如何在没有验证码或集中管理系统(例如 akismet)的情况下防止垃圾邮件【英文标题】:How to Prevent SPAM without CAPTCHAs or a Centrally managed system (e.g. akismet) 【发布时间】:2010-11-20 18:25:06 【问题描述】:是否有人能够在不给访问者带来负担(例如 CAPTCHA)和不使用集中式垃圾邮件报告系统(例如 Akismet)的情况下成功阻止其网站上的垃圾邮件
我找到了this & it looks promising, but doesn't contain detailed deployment instructions.
我希望展示我的 Web 表单,而不会给我的用户带来类似 CAPTCHA 的技术的负担,而且还想主动自动防止垃圾邮件。
似乎没有关于如何实施这种技术的详细说明/教程。
免责声明
另外,我意识到没有适合防止垃圾邮件的灵丹妙药。但是,如果简单地部署一个非侵入性(用户不可见)的预防系统,可以阻止 95% 以上的垃圾邮件,那么值得努力部署。
【问题讨论】:
这里讨论了很多想法***.com/questions/8472/… @skaffman,如果您没有注意到,那篇文章将我原始帖子中的链接作为解决方案。我的问题是,没有足够详细的说明来说明如何实施这种技术 很公平。您的评论在描述您实际寻找的内容方面比您的问题更清楚 - 请考虑修改问题。 【参考方案1】:蜜罐验证码 (article by Phil Haack)。是用来做你正在寻找的东西的常用方法。这不是万无一失的,但究竟是什么?
这似乎是您已经探索过的内容。只要尽职尽责地了解解决方案的局限性是什么,如果您仍然发现它满足您的需求,请确保该技术已被其他人很好地使用。
【讨论】:
【参考方案2】:如果有最终解决方案,则根本不需要 CAPTCHA。但是,如果您的站点的大小不足以保证有人手动寻找破解它的方法,那么通过默默无闻的安全性可能是最好的方法。例如您在上面提供的链接,或者像添加一个名为“City_2”之类的输入并将其隐藏一样简单。如果输入框已填写,那么您很可能遇到了垃圾邮件发送者,因为他们会自动填写每个字段 - 只需转储数据并继续前进……只需我的 2 美分。
【讨论】:
虽然 City_2 解决方案可能不错,但我想说“通过默默无闻的安全”根本不是一种安全。 @Jason:验证码本身就是“通过默默无闻的安全”,实际上是字面意思。必须识别一些模糊(扭曲)的文本,仅此而已。没有真正的安全,没有隐藏的部分、以前交换过的密钥或任何东西。 Captcha 对机器来说比对人类来说更晦涩一些,这就是重点。【参考方案3】:This 是一个非常好的解决方案,我在我的项目中使用它。
值得一试...
【讨论】:
这看起来像是一个集中管理的服务,可以将我的 cmets 标记为垃圾邮件与否。我宁愿将所有内容都放在我的系统本地,而不是依赖第三方。不过谢谢【参考方案4】:我使用Akismet,它实际上与垃圾邮件过滤器非常相似,但非常强大,因为它可以不断地构建贝叶斯配置文件,其中包含使用该服务的每个站点的组合垃圾邮件(每天大约 1800 万厘米)。他们的网络服务非常简单而且速度非常快——只需通过网络发送评论,他们就会发回“垃圾邮件”或“非垃圾邮件”响应。几乎每个平台都有existing Akismet libraries。
在我的网站上,如果评论通过了,我就把它存入数据库,否则我就默默地忽略它。
【讨论】:
我已经修改了我的问题,请不要使用集中式垃圾邮件管理系统。 (不想依赖第三方)【参考方案5】:摆脱 99% 的垃圾邮件,看这个 - http://wordpress-plugins.feifei.us/hashcash/
显然它只能防止自动垃圾邮件,将它与 Akismet 或其他东西一起使用并获得 100% 的保护。
更新:HashCash 的工作原理? 垃圾邮件免费(使用僵尸网络免费),这就是它起作用的原因。所以这个想法是,如果这个过程可以使(CPU)昂贵,那么批量垃圾邮件/消息将不起作用。更多细节在这里 - http://en.wikipedia.org/wiki/Hashcash
可以使用 javascript 实现更简单的版本。在提交表单之前,脚本会生成一个计算值。这个过程必须是 CPU 昂贵的。大多数僵尸网络会避免这样做,因此不会自动发送垃圾邮件。
【讨论】:
我不清楚 HashCash 是如何工作的。您介意详细说明吗?【参考方案6】:我最近尝试了一种非常简单的技术。我注意到,当出现一组单选按钮时,垃圾邮件机器人似乎总是要么选择第一个选项,要么接受预先检查的任何选项。因此,在我运行的一个网站上,我有一个表格,用户填写了可能有六个问题。其中一个问题是带有用于选择的单选按钮的“条目类型”。因此,我添加了一个新的首选选项“我是垃圾邮件发送者”,并附有解释为什么存在该选项的注释,并将其设为默认选项。如果表单是在选中该选项的情况下提交的,我会返回一条错误消息,而不是通常的确认消息。自从这样做以来,我收到的垃圾邮件数量几乎为零。我不知道剩下的是否是采取不同策略的垃圾邮件机器人——也许是在可用的单选按钮中随机选择——或者是人类垃圾邮件发送者而不是机器人。
我这样做主要是为了看看它是否可行——坦率地说,因为它很有趣,可以欺骗垃圾邮件机器人,让他们简单地坦白并自首!大多数情况下,我将其提出来进行讨论:也许它会有助于产生更好的想法。
如果垃圾邮件发送者认为我的小网站值得特别关注,他们可以使用更智能的垃圾邮件机器人轻松击败它。但是对于许多反垃圾邮件方案来说,情况就是如此。
【讨论】:
【参考方案7】:关于任何反垃圾邮件系统的一般评论:您所做的任何事情都不会 100% 安全。如果您的网站足够大或奖励足够多,以至于垃圾邮件发送者决定特别注意破坏它,他们可能会找到方法。但这就像他们经常说的家庭安全:当然,一个熟练、专业的小偷可以击败普通房主可能负担得起的任何警报系统。但是你会把笨拙的业余爱好者挡在门外,如果你给专业人士带来了足够的麻烦,你就会增加他的风险,当他打破它时,你会回家或者邻居会看到他并打电话给他警察。当我在军队工作时,我们经常讨论安全和阻止合法用户工作之间的平衡。军队的目标不是某种假设的“绝对安全”,而是足以将风险降低到“可接受的水平”,同时对授权人员造成的不便最小化。显然,什么是“可接受的”取决于你要保护什么:我当然希望保护核弹头的人坚持比我们在雷达系统周围设置的更高级别的安全性。在疑似发生袭击的地区,比如中东的基地,人们的安全性比我们在中美洲基地的安全性更高。等等。
要点是:您的网站成为目标的可能性有多大?我当然希望我的银行使用更严格的安全措施来保护我的资金,而不是我费心使用来防止在我运行的会议网站上提交垃圾邮件摘要。拥有数百万访问者且知名的网站可能比拥有数千或数百名访问者的晦涩网站需要更好的安全性。 “足够好”是多少?
【讨论】:
【参考方案8】:我基本上在我的网站上使用了一个技巧来防止垃圾邮件,并且效果很好(至少在垃圾邮件程序程序员阅读这篇文章之前;))。
代码是这样的:
在构建包含表单的站点的脚本中,我实现了:
$_SESSION['lastSiteId'] = 'something Unique';
$_SESSION['lastSiteRequest'] = time();
包含将 cmets 写入数据库的逻辑的脚本包含以下内容:
if($_SESSION['lastSiteId'] == 'something Unique'
&& $_SESSION['lastSiteRequest'] + 5 < time())
insertComment();
else
echo "Please read the article before posting a comment";
请记住,这是为您提供想法的伪代码。你最终必须独自实现它...... ;)
它所做的只是检查在重新渲染表单和发送 POST 请求之间是否超过 5 秒。
请注意,垃圾邮件机器人工程师没有睡觉。赌注是,如果程序员希望这样,垃圾邮件机器人可以在发布不需要的输入之前等待几秒钟。 问题是:如果垃圾邮件发送者必须在请求之间等待 5 秒,可以发送多少垃圾邮件?看,也许这是防止垃圾邮件的最终解决方案。
将时间测试与 javascript 测试(如果可能并且需要的话)加上预填充/未填充的隐藏字段技巧相结合,您应该在几年后远离垃圾邮件。
【讨论】:
当我写这篇评论时,第一个垃圾邮件机器人通过我的垃圾邮件预防机制成功了。它是“您的网站在我眼中是一种荣誉。继续写出如此好的内容页面。” - 一种垃圾邮件。垃圾邮件机器人花了将近 2 年的时间才向我的博客发送评论,所以我认为我的方法很好,只是需要变得更强大。 我的解决方案是将</a>
、[/url]
和[/link]
列入黑名单,并带有礼貌的信息,以切换到裸网址并重新提交。在任何其他测试甚至需要运行之前杀死 99% 的垃圾邮件,并通过攻击垃圾邮件机器人不太可能改变的东西来做到这一点,因为针对 不 阻止标记的网站取消优化他们的 SEO 垃圾邮件。跨度>
【参考方案9】:
在您的表单(cmets 或联系表单)中,您应该添加一个隐藏的输入
<input type="text" id="hidden_input" name="hidden_input" style="display:none;"/>
并编写一个小 php 来检查此输入是否已填充,因此您可以选择“if than else”来控制
if($_POST['hidden_input'] != "")
echo('<p>You are a spambot!!!</p>');
这是因为人们看不到此表格,所以我们无法填写。通过这种方式确实 bot 填充了每个输入,所以如果每个输入都被填充 PHP 发送此错误消息并且它不会发送到服务器 cmets 或电子邮件,
【讨论】:
【参考方案10】:向用户提出一个简单、随机的数学问题。如果他们解决了问题,他们会看到提交按钮。否则,他们不会。这也适用于静态网站。
这是问题输入组
<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,则该技巧将不起作用。
【讨论】:
以上是关于如何在没有验证码或集中管理系统(例如 akismet)的情况下防止垃圾邮件的主要内容,如果未能解决你的问题,请参考以下文章
mirai登陆失败反复验证码或提示登录存在安全风险或提示版本过低的解决方法
GitHub也要手机扫码或短信验证了,不启用不能提交代码,最晚明年底执行