16進数コードメールアドレス-爬虫類がメールアドレスを収集することを避ける

11201 ワード

   :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はメールボックスを16進数符号化する際にランダム性を引用し、悪意のある収集を防ぐ能力を強化した.
エンコード結果は次のとおりです.
<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>

青色マークの文字は16進符号化されていないことがわかります.
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