十六进制编码邮箱地址——避免爬虫收集邮箱地址

  作者:zhanhailiang 日期:2013-04-26

目的

避免显示的邮箱地址被address-harvesting spambots(邮箱地址收集爬虫)收集。当然,以下这种方式只能避免一部分的爬虫收集,仍然还有些高级爬虫可以收集到。

实现

<?php
 
function hexentities($str) {
    $return = '';
    for($i = 0; $i < strlen($str); $i++) {
        $return .= '&#x'.bin2hex(substr($str, $i, 1)).';';
    }
    return $return;
}
 
echo hexentities("mailto:address@example.com").PHP_EOL;
echo hexentities("address@example.com").PHP_EOL;
 
 
// &#x6d;&#x61;&#x69;&#x6c;&#x74;&#x6f;&#x3a;&#x61;&#x64;&#x64;&#x72;&#x65;&#x73;&#x73;&#x40;&#x65;&#x78;&#x61;&#x6d;&#x70;&#x6c;&#x65;&#x2e;&#x63;&#x6f;&#x6d;
 
// &#x61;&#x64;&#x64;&#x72;&#x65;&#x73;&#x73;&#x40;&#x65;&#x78;&#x61;&#x6d;&#x70;&#x6c;&#x65;&#x2e;&#x63;&#x6f;&#x6d;
<p><a href="&#x6d;&#x61;&#x69;&#x6c;&#x74;&#x6f;&#x3a;&#x61;&#x64;&#x64;&#x72;&#x65;&#x73;&#x73;&#x40;&#x65;&#x78;&#x61;&#x6d;&#x70;&#x6c;&#x65;&#x2e;&#x63;&#x6f;&#x6d;">&#x61;&#x64;&#x64;&#x72;&#x65;&#x73;&#x73;&#x40;&#x65;&#x78;&#x61;&#x6d;&#x70;&#x6c;&#x65;&#x2e;&#x63;&#x6f;&#x6d;</a></p>

实际解析显示为:

<p><a href="mailto:address@example.com">address@example.com</a></p>

更进一步,可以参考Markdown AUTOMATIC LINKS对邮箱的自动链接处理:

Automatic links for email addresses work similarly, except that Markdown will also perform a bit of randomized decimal and hex entity-encoding to help obscure your address from address-harvesting spambots.

简单说,Markdown对邮箱进入十六进制编码时引用了随机性,增强防恶意收集的能力。

如下为其编码结果:

<p><a href="m&#97;&#105;&#108;t&#111;:&#97;&#x64;&#x64;&#x72;&#101;&#115;&#115;&#64;&#x65;&#x78;&#97;&#109;p&#x6C;&#x65;&#46;&#x63;&#x6F;m">&#97;&#x64;&#x64;&#x72;&#101;&#115;&#115;&#64;&#x65;&#x78;&#97;&#109;p&#x6C;&#x65;&#46;&#x63;&#x6F;m</a></p>

可以看出,蓝色标记的字符并没有进行十六进制编码。

对Markdown对邮箱地址的自动链接算法有兴趣的同学请参考Markdown包里的源码Markdown.pl:

1167 sub _DoAutoLinks {
1168     my $text = shift;
1169 
1170     $text =~ s{<((https?|ftp):[^'">\s]+)>}{<a href="$1">$1</a>}gi;
1171 
1172     # Email addresses: <address@domain.foo>
1173     $text =~ s{
1174         <
1175         (?:mailto:)?
1176         (
1177             [-.\w]+
1178             \@
1179             [-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+
1180         )
1181         >
1182     }{
1183         _EncodeEmailAddress( _UnescapeSpecialChars($1) );
1184     }egix;
1185 
1186     return $text;
1187 }

参考:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值