1. 概要
国内のみアクセスを許可する.htaccessファイルを作成するPHPプログラムです。
データはhttps://ftp.apnic.net/stats/apnic/delegated-apnic-latestから取得します。
2. スクリプト
<?php
$site = 'https://ftp.apnic.net/stats/apnic/delegated-apnic-latest';
print "<pre>\n";
print '# '. date('Y/m/d H:i'). "\n";
print '# '. $site. "\n";
print "\n";
print "order deny,allow\n";
print "deny from all\n";
print "\n";
foreach (file($site) as $line){
if ('apnic|JP|ipv4' !== substr($line, 0, 13)) continue;
list($dmy1, $dmy2, $dmy3, $ip, $scope, $dmy4, $status) = explode("|", $line);
if ('allocated' != trim($status) && 'assigned' != trim($status)) continue;
$prefix = log($scope) / log(2);
$prefix = 32 - $prefix;
print "allow from {$ip}/$prefix\n";
}
print "</pre>\n";
(ネットワークの速度によりますが、実行完了まで少々時間がかかります)
3. 使用方法
実行結果で作成したデータを、アクセス制限したいディレクトリ下に「.htaccess」というファイル名で保存します。(ブラウザの「別名で保存」した場合は先頭と末尾の<pre></pre>を削除してください)
「.htaccess」を保存したディレクトリ以下の全ての階層にアクセス制限が適用されます。
4. 出力ファイルの説明
出力ファイル(国内割り当てIPのリスト)は下のようになります。
# 2023/12/05 17:24
# https://ftp.apnic.net/stats/apnic/delegated-apnic-latest
order deny,allow
deny from all
allow from 1.0.16.0/20
allow from 1.0.64.0/18
:
「#」ではじまる行はコメントです。
「order deny, allow」は、次に続く「allow」と「deny」 の指示の評価の順序を定義します。
今回は「deny」を先に評価し、次に「allow」を評価します。まず「deny from all」ですべてのアクセスを拒否し、 次に「allow from …」で個別にアクセス許可します。
ちなみに「order allow, deny」と書いてしまうと「allow」と「deny」 の書き順に関係なく、個別に「allow from …」でアクセス許可して、最後に「deny from all」ですべてのアクセスを拒否するみたいなことになります。
説明が前後しましたが「deny」がアクセス禁止で「allow」がアクセス許可です。
「deny」と「allow」に続けてアドレス範囲を指定します。27.132.8.0 〜 27.132.8.255の範囲を指定する場合は「27.132.8.0/24」と書きます。
5. 注意事項
- サーバーが「.htaccess」の利用できる設定になっている必要があります。
- IPv6には対応していません。
- アクセス可能IPアドレスが制限されると不具合が発生するかもしれません。
(Google等のクローラが国外アドレスの可能性があります。国内企業(人)が国外アドレスを使用している可能性があります)