E-mail address の HTML エンティティ化 (2005/09/01)

世の中には,メールアドレス収集ソフトなるものがあるらしいです.ウェブページのソースファイルに書かれているメールアドレスを収集していくソフトです.回収されたメールアドレスは,おそらくスパムメールなどに利用されるのでしょう.

これに対する対策として,ウェブページに掲載するメールアドレスに対して,メールアドレスの半角の@を全角の@にする,メールアドレスを画像ファイルにおきかえる,といった方法などが知られています.しかし,これらの対策は,メールアドレスへのリンクを利用することができません.メールアドレスはできる限り回収されたくないが,メールアドレスへのリンクを残したい人には,メールアドレスの HTML エンティティ化という方法があります.

たとえば, "m" の HTML エンティティ形式とは,"m" となります.このような HTML エンティティ形式で書けば,"m" と表示されます.ちなみに,この "m" はエンティティ形式で書きました.ソース表示していただければ分かると思います.

HTML ファイル内にある "mailto:who@domain" などをランダムに HTML エンティティ形式にすれば,メールアドレス収集ソフトに読み取られる可能性が低くなります.次の例は,"@" と ":" のみを HTML エンティティ形式にしたものです.

<a href="mailto:who@domain">who@domain</a>
<a href="mailto&#58;who&#64;domain">who&#64;domain</a>

次は,ランダムにエンティティ形式する perl スクリプトです.

#!/usr/bin/perl
# ランダム HTML エンティティ化スクリプト

$en_rate = 0.6;   # HTML エンティティ化率

if (@ARGV == 1) { $word = shift; }
elsif (@ARGV == 2) { $word = shift; $en_rate = shift; }
else { die "Usage: $0 [WORD] [RATE (optional)]\n"; }

$word = html_entities($word,$en_rate);
print "$word\n";

exit;

sub html_entities {
  my ($word,$en_rate) = @_;
  my $en_word = "";
  for (0 .. length($word)-1) {
    if ($en_rate > rand) {
      $en_word .= '&#' . ord(substr($word,$_,1)) . ';';
    } else { $en_word .= substr($word,$_,1); }
  }
  $en_word =~ s/@/&#64;/g;
  $en_word =~ s/\./&#46;/g;
  $en_word =~ s/:/&#58;/g;

  return $en_word;
}

このスクリプトは,入力の文字列のうち,"@", ".", ":" をエンティティ形式に変換し,それ以外の文字は "$en_rate" で指定される割合に従い,エンティティ形式に変換します.このスクリプトの名前を "htmlen" とおけば,

% htmlen mailto:who@domain 0.3
ma&#105;lto&#58;w&#104;&#111;&#64;&#100;om&#97;in
というように利用できます.第2引数がエンティティ形式変換率です.これにより,メールアドレスをエンティティ形式にしてから,HTML ファイルに書き込めば,メールアドレス収集ソフトから読み取られる可能性を低くできます.私のところにある全ての HTML ファイル内のメールアドレスは全てエンティティ形式にランダムに書き換えています.

また,掲示板などの CGI で,メールアドレスを書いて投稿すると,そのメールアドレスがデータベースファイルにそのまま書き込まれるような CGI があります.この場合,データベースファイルは誰でもが書き込めるようなファイルですので,このファイルからメールアドレスを回収される危険性があります.先ほどの perl スクリプト内のサブルーチン "html_entities" でメールアドレスのデータベースファイルに書き込む前に実行するように CGI を変更すれば,そのまま書き込まれるより危険性は低くなります.


梅原 大祐 / UMEHARA Daisuke umehara@kit.ac.jp
Last modified: 2020/05/01 15:37
Total Access Count