如何保护网站上的电子邮件地址免受现代支持 JS 的机器人的攻击?
How to protect e-mail addresses on a website from modern day JS-enabled bots?
这是网站上重复出现的问题,但在花了 20 分钟浏览旧问题后,我无法找到现代解决方案。
我以前使用过这种基于JS的方法来保护地址。在使用 JS 方法之前,我使用的是基于图像和 flash 的解决方案。下面是我的老办法。
动画示例代码笔:http://codepen.io/anon/pen/kIjKe/
HTML:
<span class="reverse eml">moc.niamod@tset</span><br>
CSS:
.reverse {
unicode-bidi: bidi-override;
direction: rtl;
}
.eml {
display: inline;
}
JS:
function reverseEmails() {
if (jQuery(".eml.reverse").length > 0) {
jQuery(".eml.reverse").each(function() {
var that = jQuery(this);
var email = that.text().split("").reverse().join("");
that.removeClass("reverse");
that.html("<a href='mailto:" + email + "'>" + email + "</a>");
});
}
}
None 这些方法现在似乎行得通,因为基于 Node.js 的抓取工具能够生成他们正在抓取的页面的图像,然后从该图像中读取任何人类可读的数据 -剩下的你们猜吧。
现在有什么方法可以让用户轻松阅读/点击/复制粘贴电子邮件地址,但支持 JS 的机器人却不行吗?
我怀疑你的直觉是正确的,如果一个电子邮件地址显示在页面上,那么机器人就可以抓取它。
最好的办法是以某种方式让服务器端参与进来。
例如,如果您只是希望访问者能够联系到您,那么您可以添加一个 "contact us" 表单,如下所示:https://store.theonion.com/t-contact.aspx
如果您希望访问者能够相互联系,那么您可能需要像 Craigslist 使用的那样构建一个匿名系统。
将电子邮件地址放在一个单独的页面上,该页面只能通过验证码访问。
当然,安全性与验证码的安全性一样好。
如果您只想保护有限数量的地址,使用您自己的混淆可能是一个重要的选择。我过去用过的一些想法;
- 填字游戏。让它变得非常简单,使用诸如缺少一个词的著名歌曲标题之类的提示(很容易 google 并且没有关于可能的第二种解释的争论)。您可以填写多个字母以使其更容易。
- 带背景噪音的录音。我不想使用自己的声音,所以我使用了带有德国口音的语音合成器(-:AT&T 网络演示 IIRC)并在背景音乐中混合了几秒钟(Frank Zappa 的 Peaches en regalia 对我来说效果很好,但口味不同)。
- 手绘图像。我喜欢画字母轮廓,但我怀疑它们是否足够规则以通过任何 OCR。
这里真正的问题不是这些解决方案的卓越之处,而是我希望可以激发您在新方向上思考的不同方法。最后,如果您提出自己独特的解决方案,您将永远更加安全;任何类似于 "new de facto standard" 的东西都将是 lowest-hanging 水果,刮板会花时间尝试采摘。
顺便说一下,我试图考虑残障人士的可用性,所以我实际上部署了音频版本,作为与基于视觉布局的其他两个交互有问题的人的后备。
顺便说一句,这些天很少有人愿意给我发电子邮件(或者他们可能愿意,但最终被当作垃圾邮件拒绝了?)坦率地说,这是一种解脱。那些通常使用我的域名的 whois 注册信息的人(使用 whois 注册商提供的匿名地址)或者是很好的猜测者。
这是我个人最喜欢的方法,到目前为止我发现它很有效,它不是防弹的,理论上可以解析 CSS3 并执行文本搜索的机器人仍然可以找到它或触发事件以收集电子邮件地址的垃圾邮件机器人必须将页面基本上输入到无头浏览器中,以某种方式确定可能是 JS 混淆的电子邮件内容这些场景是大量的工作,可能没有任何好处,没有垃圾邮件发送者会考虑这样做它,事实是我迄今为止没有收到过垃圾邮件,它对人类非常有用,无论是阅读还是点击:
<style>
.email:after{ content:'@mydomain.com'; }
</style>
Contact me at:<div class="email">myemail</div>
<script>
$('.email').click(function(){
window.location.href='mailto:'+$(this).html()+'@mydomain.com';
});
</script>
问题是电子邮件不是 link,因此机器人永远不会触发点击事件,因为他们甚至不知道它会执行任何操作。
这是网站上重复出现的问题,但在花了 20 分钟浏览旧问题后,我无法找到现代解决方案。
我以前使用过这种基于JS的方法来保护地址。在使用 JS 方法之前,我使用的是基于图像和 flash 的解决方案。下面是我的老办法。
动画示例代码笔:http://codepen.io/anon/pen/kIjKe/
HTML:
<span class="reverse eml">moc.niamod@tset</span><br>
CSS:
.reverse {
unicode-bidi: bidi-override;
direction: rtl;
}
.eml {
display: inline;
}
JS:
function reverseEmails() {
if (jQuery(".eml.reverse").length > 0) {
jQuery(".eml.reverse").each(function() {
var that = jQuery(this);
var email = that.text().split("").reverse().join("");
that.removeClass("reverse");
that.html("<a href='mailto:" + email + "'>" + email + "</a>");
});
}
}
None 这些方法现在似乎行得通,因为基于 Node.js 的抓取工具能够生成他们正在抓取的页面的图像,然后从该图像中读取任何人类可读的数据 -剩下的你们猜吧。
现在有什么方法可以让用户轻松阅读/点击/复制粘贴电子邮件地址,但支持 JS 的机器人却不行吗?
我怀疑你的直觉是正确的,如果一个电子邮件地址显示在页面上,那么机器人就可以抓取它。
最好的办法是以某种方式让服务器端参与进来。
例如,如果您只是希望访问者能够联系到您,那么您可以添加一个 "contact us" 表单,如下所示:https://store.theonion.com/t-contact.aspx
如果您希望访问者能够相互联系,那么您可能需要像 Craigslist 使用的那样构建一个匿名系统。
将电子邮件地址放在一个单独的页面上,该页面只能通过验证码访问。
当然,安全性与验证码的安全性一样好。
如果您只想保护有限数量的地址,使用您自己的混淆可能是一个重要的选择。我过去用过的一些想法;
- 填字游戏。让它变得非常简单,使用诸如缺少一个词的著名歌曲标题之类的提示(很容易 google 并且没有关于可能的第二种解释的争论)。您可以填写多个字母以使其更容易。
- 带背景噪音的录音。我不想使用自己的声音,所以我使用了带有德国口音的语音合成器(-:AT&T 网络演示 IIRC)并在背景音乐中混合了几秒钟(Frank Zappa 的 Peaches en regalia 对我来说效果很好,但口味不同)。
- 手绘图像。我喜欢画字母轮廓,但我怀疑它们是否足够规则以通过任何 OCR。
这里真正的问题不是这些解决方案的卓越之处,而是我希望可以激发您在新方向上思考的不同方法。最后,如果您提出自己独特的解决方案,您将永远更加安全;任何类似于 "new de facto standard" 的东西都将是 lowest-hanging 水果,刮板会花时间尝试采摘。
顺便说一下,我试图考虑残障人士的可用性,所以我实际上部署了音频版本,作为与基于视觉布局的其他两个交互有问题的人的后备。
顺便说一句,这些天很少有人愿意给我发电子邮件(或者他们可能愿意,但最终被当作垃圾邮件拒绝了?)坦率地说,这是一种解脱。那些通常使用我的域名的 whois 注册信息的人(使用 whois 注册商提供的匿名地址)或者是很好的猜测者。
这是我个人最喜欢的方法,到目前为止我发现它很有效,它不是防弹的,理论上可以解析 CSS3 并执行文本搜索的机器人仍然可以找到它或触发事件以收集电子邮件地址的垃圾邮件机器人必须将页面基本上输入到无头浏览器中,以某种方式确定可能是 JS 混淆的电子邮件内容这些场景是大量的工作,可能没有任何好处,没有垃圾邮件发送者会考虑这样做它,事实是我迄今为止没有收到过垃圾邮件,它对人类非常有用,无论是阅读还是点击:
<style>
.email:after{ content:'@mydomain.com'; }
</style>
Contact me at:<div class="email">myemail</div>
<script>
$('.email').click(function(){
window.location.href='mailto:'+$(this).html()+'@mydomain.com';
});
</script>
问题是电子邮件不是 link,因此机器人永远不会触发点击事件,因为他们甚至不知道它会执行任何操作。