邮箱放网上老被垃圾邮件轰炸,咋整?几种硬核防护骚操作来搞定

2,644字
11–17 分钟
in

不少站长在网页上丢个邮箱链接,没过多久收件箱就被垃圾广告、钓鱼邮件塞爆。那些爬虫脚本满网抓取邮箱地址,跟牛皮癣广告一样烦人。这里头有个叫“混淆”的招儿挺管用——把邮箱地址搞得机器看不懂、人却能正常用。下面聊几个亲测有效的方案,按需安排上。

目录

网站公开邮箱地址后,垃圾爬虫会自动抓取并塞垃圾邮件。解决办法是让地址对机器难读,对人易用。文中介绍四种方案:HTML注释打乱、CSS隐藏干扰码、JavaScript解码Base64、第三方表单中转。每种都附带详细步骤和避坑点,小白照着点几下就能搞定。

HTML注释法

操作流程

打开网页源码,找到要展示邮箱的地方。正常写法是email@address.com,爬虫一眼认出。改成这样:

如果联系,请发邮件至<!-- 乱入一堆废话 --> email@<!-- 再来点干扰 -->address.com

页面显示效果不变,用户看到“email@address.com”。爬虫抓取源码时会顺带把注释里的内容也拿进去,但注释里的字符打断了邮箱格式,不少简单爬虫就认不出来了。

细节进阶

需要mailto:链接的话,把href属性也做手脚:

<a href="mailto:email<!-- 加料 -->@<!-- 加料 -->address.com">发邮件</a>

注意注释别夹在邮箱关键字符中间,比如e<!-- -->mail会变成“email”少字母。每个片段至少保留完整字母。另外有些高级爬虫会先剔除注释再匹配,这招对它们失效。可以配合反转顺序使用:

<!-- 前半段 --> address.com <!-- 后半段 --> email@

然后在显示时靠CSS的unicode-bidi属性调回来?有点复杂,简单场景用第一个方法就够了。

CSS障眼法

加点干扰再藏起来

HTML里写真实邮箱,但中间塞一堆废话并用span包住,然后CSS让这堆废话不显示。步骤:

第一步,构造HTML:

<p>联系邮箱:<span class="hideSpam" aria-hidden="true">别爬了求求</span> email@<!-- 再来点 -->address.com</p>

第二步,写CSS:

span.hideSpam {
  display: none;
}

用户看到“联系邮箱:email@address.com”。爬虫抓源码时那堆“别爬了求求”还在,打乱了邮箱模式。aria-hidden="true"确保读屏软件忽略废话,不影响无障碍访问。

多重干扰加强版

多塞几层不同类名的隐藏元素:

email<span class="x1" aria-hidden="true">【广告位招租】</span>@<span class="x2" aria-hidden="true">【爬虫退散】</span>address.<span class="x3" aria-hidden="true">【已防护】</span>com

CSS分别隐藏.x1.x2.x3。爬虫需要同时识别并移除多个不同类名,难度提升。不过注意mailto:链接里用这招会失效,因为href属性值里的干扰码不会被CSS处理,链接会变成无效地址。

JS解码术

Base64编解码一条龙

把邮箱地址转成乱码,等页面加载完再用JS还原。具体分三步:

第一步,找个在线编码工具(搜“base64编码”就有),输入邮箱如hello@example.com,得到编码结果aGVsbG9AZXhhbXBsZS5jb20=

第二步,写HTML占位:

<a id="mailLink" href="">点我发邮件</a>

第三步,在页面底部或单独JS文件里写:

var encodedMail = "aGVsbG9AZXhhbXBsZS5jb20=";
var linkElement = document.getElementById("mailLink");
linkElement.setAttribute("href", "mailto:" + atob(encodedMail));

atob是浏览器内置方法,把Base64字符串解码回原文。页面打开后,链接的href变成mailto:hello@example.com,点击就能调起邮件客户端。

动态插入内容

不想用链接,直接显示邮箱文本也行:

<span id="mailSpan"></span>
<script>
var coded = "aGVsbG9AZXhhbXBsZS5jb20=";
document.getElementById("mailSpan").innerText = atob(coded);
</script>

进阶玩法:用凯撒密码,比如每个字母往后移三位。写个解密函数,爬虫看不懂JS逻辑就抓瞎。但注意JS必须能正常运行,如果浏览器关了JS,邮箱位置就是空白。可以加个<noscript>提示:“启用JavaScript查看邮箱”。

嵌入表单法

第三方服务中转

完全不公开邮箱,访客通过表单填消息,服务商转发到邮箱。注册某表单服务(搜“表单后端服务”能找到免费档),拿到专属的action地址。复制以下代码到网页:

<form action="https://某服务.com/f/你的密钥" method="POST">
  <label> 你的邮箱:
    <input type="email" name="email" />
  </label>
  <label> 消息内容:
    <textarea name="message"></textarea>
  </label>
  <input type="text" name="_gotcha" style="display:none" />
  <button>发送</button>
</form>

注意那个隐藏的_gotcha输入框。真人看不到也不会填,但有些机器人会无脑填满所有表单域。服务端发现这个字段有内容就直接扔进垃圾堆,不转发邮件。

自定义字段和防刷

可以增加更多字段,比如姓名、主题。在action地址后加?参数或者修改表单内name属性。另外可以加验证码(reCAPTCHA类服务),但会稍微麻烦点。不想依赖第三方的话,自己写后端接收表单再发邮件,那就得伺候服务器了。

方案名上手难度需要JSmailto支持防爬强度
HTML注释极低部分可用
CSS障眼中等
JS解码较强
嵌入表单中高最强

挑哪个:随便摆个联系方式用HTML注释够快;想要mailto链接又不怕JS关闭的,上JS解码;完全不差事、只想收消息的,直接表单走起。记得每个方案都有适用场景,按需抄代码就完事了。