.jp以外のドメインからの投稿を禁止する

スパム投稿のほとんどは海外から行われます。投稿もとのドメイン名(ホスト名)を調べて、海外からの投稿であると判断できれば、投稿を拒否することは、スパム対策として有効です。

例えば、OTD掲示板では、次のようなドメインからの投稿を規制しているということです。

.ae .ar .at .au .be .bg .bk .bn .br .by .ca .cc .ch .cl .cn .co .cr .cz .de
.dk .do .ee .es .eu .fi .fm .fr .gr .hk .hr .hu .id .ie .il .in .is .it .ke
.kg .kr .mu .mx .my .nl .nu .nz .om .ph .sa .se .sg .si .sk .sv .th .tt .tw
.ua .uk .us .uy .pe .pk .pl .ru .ro .ve .za

ここでは、投稿もとのドメイン名を調べ、.jp以外のドメインからの投稿を禁止する方法を説明します。なお実際には、.jp以外が全て国外からの投稿であるとは限りませんので、.jp以外を無条件で拒否するのは危険です。

なお、IPアドレスから国を調べる方法は、「不正アクセスの発信地の国別統計をとろう!」で紹介されています。

Perl

まず、Perlのコードを示します。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
#ホスト名の取得
$remote_addr = $ENV{'REMOTE_ADDR'};
$remote_host = $ENV{'REMOTE_HOST'};
if (!$remote_host || $remote_host eq $remote_addr)
{
    $remote_host = gethostbyaddr(pack('C4',split(/\./, $remote_addr)),2);
}
 
#ホスト名が取得できなかった時
if (!$remote_host || $remote_host eq $remote_addr)
{
    print 'ホスト名の逆引きができないホストからの投稿は禁止されています。';
    exit;
}
 
#ホスト名が許可されたものか調べる
#ここでは、.jpドメインだけを許可する
if ($remote_host !~ /\.jp$/)
{
    print '.jpドメイン以外のホストからの投稿は禁止されています。';
    exit;
}
 
print 'ホストは.jpドメインです。';

PHP

次にPHPのコードを示します。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
//ホスト名を取得する
$remote_host = $_SERVER['REMOTE_HOST'];
if (empty($remote_host) || $remote_host == $_SERVER['REMOTE_ADDR'])
{
    $remote_host = gethostbyaddr($_SERVER['REMOTE_ADDR']);
}
 
//ホスト名が取得できなかった時
if (empty($remote_host) || $remote_host == $_SERVER['REMOTE_ADDR'])
{
    exit('ホスト名の逆引きができないホストからの投稿は禁止されています。');
}
 
//許可されたホストか調べる
//ここでは、.jpドメインだけを許可する
if (!preg_match('/\.jp$/', $remote_host))
{
    exit('.jpドメイン以外のホストからの投稿は禁止されています。');
}
 
exit('ホストは.jpドメインです。'); 

C#

ASP.NETのC#のコードは、次のようになります。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
protected void Page_Load(object sender, EventArgs e)
{
    //ホスト名を取得する
    string hostName = Request.UserHostName;
    if (hostName == "" || hostName == Request.UserHostAddress)
    {
        hostName = System.Net.Dns.Resolve(Request.UserHostAddress).HostName;
    }
 
    //ホスト名が取得できなかった時
    if (hostName == "" || hostName == Request.UserHostAddress)
    {
        Label1.Text = 
            "ホスト名の逆引きができないホストからの投稿は禁止されています。";
        return;
    }
 
    //許可されたホストか調べる
    //ここでは、.jpドメインだけを許可する
    if (!System.Text.RegularExpressions.Regex.IsMatch(hostName, "\\.jp$"))
    {
        Label1.Text =
            ".jpドメイン以外のホストからの投稿は禁止されています。";
        return;
    }
 
    Label1.Text = "ホストは.jpドメインです。";
}

.htaccessで制限する

.htaccessを使って海外からのアクセスを制限する方法は、IPアドレスで日本国外(海外/外国)からのアクセスを制限する.htaccess CGI'sで紹介されています。


ページ情報
[ トップ ]   [ 編集 | 凍結 | 差分 | バックアップ | 添付 | 複製 | 名前変更 | リロード ]   [ 新規 | 子ページ作成 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]