.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;
}
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;
}
if (!System.Text.RegularExpressions.Regex.IsMatch(hostName, "\\.jp$"))
{
Label1.Text =
".jpドメイン以外のホストからの投稿は禁止されています。";
return;
}
Label1.Text = "ホストは.jpドメインです。";
}
|
.htaccessで制限する †
.htaccessを使って海外からのアクセスを制限する方法は、IPアドレスで日本国外(海外/外国)からのアクセスを制限する.htaccess CGI'sで紹介されています。