已经有很多讨论,最近关于如何防止垃圾邮件机器人从基于Web的形式提交网站。 已提出许多解决方案,其中许多影响的可用性和可访问的Web页。 验证码是一个典型的例子中,用户和可达性是直接影响。
在过去的一年,所以我已编制了垃圾邮件拦截在网络的形式提交下列基本技巧。 我已经实施只是其中一对夫妇,并通过记录发现,他们已经有效地约99%的垃圾邮件机器人的意见书同时不降低或可用性上非常方便的形式或影响不大。 几乎所有这些技术都是执行服务器端用PHP和有关PHP代码如下所示,不过,测试可以很容易地在几乎任何服务器端脚本语言实现。
免责声明1:这些垃圾邮件防御技术可能不适合企业级应用程序,其中垃圾邮件发送者可能针对具体形式。 它们是用于通用的接触,评论,或登记表格,其中一个垃圾邮件发送者是不太可能花时间去尝试绕过特定的垃圾邮件防范机制。
声明二:这些技术主要是阻止垃圾邮件机器人和自动化的提交方案。 他们还可以过滤某些内容。 然而,他们可能不会防止你的网站的实际专门人力张贴垃圾邮件。
该技术是:
- 检测垃圾邮件类似内容在提交的表单元素
- 检测内容在一个隐藏的表单元素
- 验证提交表单值
- 在多个搜索相同内容的表单元素
- 生成动态内容,以确保在表单提交在特定的时间窗口或同一用户
- 建立多级表单或表单验证页面
- 确保表格从您的服务器发布
检测垃圾邮件类似内容在提交的表单元素
这种技术是可能是最强大的垃圾邮件防治技术。 大部分垃圾邮件的僵尸网络中存在的任何网站的网址后在努力增加流量或增加他们的搜索引擎排名,他们正试图劫持您的垃圾邮件的形式发送给您或他人。 检测常用的垃圾邮件内容或电子邮件标题注射将停止几乎所有的垃圾邮件机器人在其轨道死亡。
下面的PHP代码,当您在表单处理页面(如表格被提交到地方)放置,将搜索最常见的头注射和其他代码,可能会诱骗或副本发送邮件形式的处理器的所有元素密件抄送信息给他人。 它检测到任何内容,也包含字符串“[网址”,这是大多数论坛软件用于指定的链接。如果有任何发现,它设置为true变量$垃圾邮件。
如果(preg_match(“/密件副本:|抄送:|多重| \ [网址|内容类型:/我”崩溃(的$ _POST))){ $ =真正的垃圾; }
注意:Internet Explorer 6中有一个错误,将不会允许适当的预格式化文本溢出。 如果您仍在使用该浏览器,你需要正确地回流从这个页面中的PHP代码。
您还可以在表单元素检测和网址链接。 下面我们来设置变量,如果美元的垃圾邮件超过3个实例“<一”或“http:”的形式出现在任何地方。
如果(preg_match_all(“/ <a|http:/i", implode($_POST), $out)”3){ $ =真正的垃圾; }
这将打败大部分垃圾邮件机器人,因为它们主要集中在张贴连结或劫持您的邮件脚本。 除此之外,一些很基本的单词过滤垃圾邮件可以被抓,发现其如此。
$ spamwords =“/(列表|的|顽皮|垃圾邮件|留言|这里)/我”;如果(preg_match($ spamwords,崩溃(的$ _POST))){ $ =真正的垃圾; }
您还可以使用最多的垃圾邮件内容的最新模式外部的垃圾邮件检测服务。 我最喜欢的是Akismet标记 。Akismet在通常用于过滤(它已阻止在过去9个月近14000垃圾评论这个博客!)博客评论垃圾邮件,但它可用于几乎任何Web窗体成功。
检测内容在一个隐藏的表单元素
大部分垃圾邮件机器人会找到你的形式,确定何种形式元素名称,并找到该窗体发布到URL。 该软件将与修改后,垃圾邮件填充表单元素的值返回到表单提交的网址。 通常情况下,机器人将填充每一个有一定价值的形式,从而为以最佳方式确保它一定会成功在被公布。 因此,如果插入一个标准的文本输入到表单元素,但它隐藏在用户直观,使用户无法进入这个领域的话,这很可能是垃圾邮件机器人仍然会后,对这一表单元素的值。 如果您发现该表单元素是用一个值提交,那么它几乎肯定是垃圾邮件机器人。
例如,您可以插入表单元素作为
<span style="display:none;visibility:hidden;"> <label for="email">忽略这个文本框。 它是用来检测垃圾邮件。如果你进入这个文本框什么,你的信息不会被发送。 </“标签> <输入type="text" name="email" size="1" value="" /> </跨度>
请注意,CSS是用来隐藏文本输入和从视图标签。 此代码也将现代隐藏此屏幕阅读器的内容。 但是,如果CSS是残疾人,输入仍会显示。 出于这个原因,解释性标签规定,不通知用户输入到文本框中什么。 我也给输入的“电子邮件”好,多汁,诱人的元素的名字 - 这几乎肯定会得到垃圾邮件机器人输入一个值。
然后,您只需检测,如果表单元素是空的。 如果没有,那么它的无论是垃圾邮件机器人或指示用户已禁用的CSS并没有按照标签。
如果$垃圾=真(空(的$ _POST ['电子邮件']));
这就像这里列出的所有战术,应在案件仍然存在有用的,知识性错误信息的用户以某种方式触发您的垃圾邮件检测标志。
验证提交表单值
这一个也许不用提,但如果你希望某些表单元素需要,确保您使用的是服务器端脚本来检测资料是否到这些表单字段输入。 如果您需要的信息是一种特殊形式的格式(如需要一个有效的e - mail地址),然后验证它。 许多机器人只会提交的领域,却没有认识到或会提出某种形式的随机信息领域的空白信息。 您的标准表单验证机制可以阻止许多灌水恶意程式。
/ /如果消息是空的,抛出一个错误如果(空(的$ _POST ['信息']))$误差为真; / /如果电子邮件格式不正确,显示错误信息如果(!eregi ("^[_的A - z0的- 9 -] +(\。[_a - z0的- 9 - ]+)*@[的A - z0的- 9 -] +(\。的[a - z0的- 9 - ]+)*( \。[排列] {2,3 })$",的$ _POST ['{电子邮件']))) 回声“请输入一个有效的电子邮件地址。”; }
在多个搜索相同内容的表单元素
有些垃圾邮件机器人将张贴到所有无法识别的表单域相同的文字。 如果你有两个表单域不应该包含相同的信息,您可以检测,如果确实是他们的价值观相同,如果是这样,你可以标记一个错误。 在我们的论坛的报名表,我发现,简单地抛出一个错误,如果第一个和最后一个名字是相同的削减机器人登记约80%。 这不是一个完美的技术,你应该确保你分析的字段应该始终是唯一的(我想还是有机会,一个人可以拥有相同的第一个和最后一个名字,是吧?)。
如果(的$ _POST ['名字'] ==的$ _POST ['姓氏'])$ =真正的垃圾;
生成动态内容,以确保在表单提交在特定的时间窗口或同一用户
通过产生独特的表单元素或创建会话变量,你可以确保你的人,访问窗体页是同一个用于提交表单。 例如,当窗体被访问时,你可以使用服务器脚本当前时间写入一个隐藏的表单元素。 当提交表单时,你可以比较与当前时间隐藏的表单值,并确保不超过,比如说,一个小时过去了。 一个生成的时间形式的价值正确的值垃圾邮件机器人的可能性是非常不可能的。 您还可以设置浏览器的cookies,或者使用其他客户端sessioning系统,以确保建立一个用户会话之间的表单页面和提交页面维护。
下面将写在当前时间的UNIX时间格式到一个隐藏的表单输入。
<输入类型=“文本”名称=“formtime”值=“?<PHP的回波时间();?>”/>
当提交表单时,你可以衡量当前的时间和形式存储在不同的价值。 如果时间差超过指定值时,你可以标记为垃圾邮件。 在这个例子中,如果超过一个小时(3600秒)之间的时间已经过去了的形式浏览和提交的时间,垃圾邮件变量。 此代码也将标记为垃圾邮件,如果formtime值已更改为其他值,如URL或电子邮件地址,消息。
如果(的$ _POST ['formtime'] <时间()-3600){ $ =真正的垃圾; }
建立多级表单或表单验证页面
通过建立一个多阶段形成过程,大部分垃圾邮件机器人将无法找到实际的脚本程序的最后形式的数据。 这可以被视为为有用户提交表单后确认,然后选择第二个按钮来实际处理提交的表单元素的投入容易。 这可以变得更加简单明了的,如果原来的形式和核查是在同一页的URL处理。 如果表单元素中的数据存储前的最后验证步骤(而不是隐藏的形式,可以由垃圾邮件机器人提交的元素)服务器端,它变得非常困难的一个自动化的系统来提交表单。
如果($ formsubmitted ==真){ / /数据库的表单元素并显示确认页。 / /如果用户验证表单信息,然后处理databased数据。 }否则{ / /显示空白表单 }
确保表格从您的服务器发布
由于大多数垃圾邮件机器人张贴到您从远程计算机形式的脚本,通过检测,如果表单的信息已经从自己的网站提交,您可以阻止你提交表格处理脚本许多灌水恶意程式。 大多数脚本程序可以检查页面引用,或者被用来获取当前网页。 重要的是要注意,它是很容易伪造的垃圾邮件机器人的引荐信息显示为如果表单是从您的Web服务器来。 此外,一些浏览器和防火墙将不会发送推荐连结的。
下面的代码将检查,以确保该页面引用(拼写错误的HTTP规范和PHP的引荐')存在,如果有的话,那引用页上的表格处理脚本相同的Web站点。 防止灌水恶意程式的浏览器或没有引荐信息的发送,消息永远不会标记为垃圾邮件。
如果((使用isset($ _SERVER中['HTTP_REFER }
结论ER'])&&stristr(使用$ _SERVER ['HTTP_REFERER '],$_服务器['HTTP_HOST ']))) {
$ =真正的垃圾;
防止垃圾邮件提交到Web窗体是艰难的工作。 然而,如果可能,我们不应该放在预防上,通过图灵测试,验证码或其他最终用户的垃圾邮件的负担。 任何时候,它成为用户的责任以某种方式手动证明他们是一个人,可获取性将降低。 这些技术提供过滤掉不放在最终用户的任何形式的垃圾邮件机器人的大部分负担的几种方法。
我相信这些不是所有的可能性,这可能是因为在我的技术有上述缺陷。(首发:www.11pcb.com)