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

  作者: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:[email protected]").PHP_EOL;
echo hexentities("[email protected]").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:[email protected]">[email protected]</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: <[email protected]>
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 }

参考:

  • http://www.php.net/manual/en/function.bin2hex.php#48861
  • http://daringfireball.net/projects/markdown/syntax

你可能感兴趣的:(十六进制编码邮箱地址——避免爬虫收集邮箱地址)