2010年9月10日金曜日

サーバー名とIPアドレスで有害なサーバーをフィルタリング

検索エンジンに我がウェブログがインデクシングされてるゲソ。
検索結果(Javascript)

しかし、「とある自由人の黙示目録」と検索するとこうなる。
検索結果

どういうことなの・・・(追記 2010/09/11: ちゃんと1ページ目に上がっているのを確認)。まぁ、どうでもいい話はともかく、本題。

ユーザーにマルウェアや有害な情報を与えるサーバー(ウェブサーバー)は、
禁止ワード避けの為に複数のエイリアス(別名)を持っています。
その為、いわゆる禁止URIを設定するだけでは簡単にすり抜けてユーザーに有害を与えてしまいます。

そこで私が作ったのは、このHarmful.pmというPerl Module(かなり汚いので潔癖症の方は注意)。
サーバー名とIPアドレスをアンパックしたものをファイルに保存しておき、
指定されたサーバー名又はそのサーバーのIPアドレスがファイルに存在する場合ブロック、といった感じ。
有害か判定するには、"Harmful::judge" にファイル名とサーバー名のリストを与える。

use Harmful;
  local $, = "\n";
  print Harmful::judge 'Harmful.txt',$msg =~ m{://([\w\.\-]+)}g;

"Harmful::judge" は、同じサーバー名が見つかれば関連付けされているIPアドレスを更新し、
同じIPアドレスが見つかれば新しくサーバー名とIPアドレスを追加します。

新しくサーバー名とIPアドレスを確実に追加するには、"Harmful::add"にファイル名とサーバー名のリストを与える。

use Harmful;
use FormParse;
  my $form = FormParse::new {};
  Harmful::add 'Harmful.txt',@{$form->method('add')};

サーバー名を削除するには、"Harmful::lose" にf(ry

use Harmful;
use FormParse;
  my $form = FormParse::new {};
  Harmful::lose 'Harmful.txt',@{$form->method('lose')};

注意するのが、「サーバー名」のみを削除するという点。
上のコードでサーバー名を削除しても、IPアドレスが同じだろうが別のサーバー名は残る。

自分もすごく悩んだのですが、今まで収集した別のサーバー名が一気に削除されるのが悲しいのでこういう仕様にしました。

そして行数を指定した数値に合わせるのが "Harmful::trim"。

use Harmful;
  Harmful::trim 'Harmful.txt',1000;

それと中で使われている "gethostbyname" 関数は遅いのでコメント等に入力できるURIは制限しておくべき。
これで説明は終わりです。他のサブルーチンは自分で解析して下さい。そもそもこれ、使う人いるのかな?

0 件のコメント:

コメントを投稿