#!/usr/local/bin/perl -w use CGI::Carp qw(fatalsToBrowser); # エラーチェック用 #----------------------------------------------------------------------------------------------- # simple env by Lilia [2003/02/05] #----------------------------------------------------------------------------------------------- use strict; use vars qw(%Ini %Prt); %Ini = ( Title => 'simple env', Rev => '0.03d', Dist => 'http://nursery.s8.xrea.com/', # ユーザー設定.. #----------------------------------------------------------------------------------------------- # GMTとの時差 TimeDiff => 9 * 60 * 60, # 日本なら 9 * 60 * 60 # アクセスログ記録 [オプション] AxsRec => 0, # ログを記録する: 1 記録しない: 0 # 記録する場合は下の2行頭の # を消して設定 # LogFile => './envlog.txt', # 記録ファイルのパス(空のファイルをアップロード) # LogMax => 500, # 最大記録件数 # 参照元(Referer)制限 [オプション] # 下のどちらかが設定されていればそれを採用してアクセスを制限(わかる人だけ) # NGRef_RE => qr#(?:1|15|2)ch|bbs(?:2\.jp|pink)|(?:j|machi|mega)bbs|ohayou|ime\.nu|renpou\.com/bbs/#i, # 正規表現:一致するもののアクセスを拒否 OKRef_RE => qr#^http://[^\?]*?(?:$ENV{HTTP_HOST}|nursery|lilia|mizuiro|strange|taiyaki)#i, # 正規表現:一致しないもののアクセスを拒否 # JavaScript等のチェック [オプション] OPTCheck => 0, # チェックする: 1 チェックしない: 0 # xrea.com ユーザー用 [特殊] XreaIns => 0, # xrea.com のバナーを挿入する: 1 挿入しない: 0 # ..ここまで #----------------------------------------------------------------------------------------------- # ファイル名の頭に「nph-」が付いていれば NPHスクリプトとして実行される NPH => ($0 =~ m|\bnph-[^/]+$|i) || 0, # IPアドレスの正規表現 Addr_RE => q/(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/, ); &redir if($ENV{QUERY_STRING} && $ENV{QUERY_STRING} =~ s|^url=(https?://)|$1|i); &ctrl if($ENV{HTTP_REFERER} && ($Ini{NGRef_RE} || $Ini{OKRef_RE}) && $ENV{HTTP_REFERER} =~ m#^(?:https?|ftp)://(?!localhost/|127\.0\.0\.1/)#i); ⪯ &log if($Ini{AxsRec}); &html; exit; # サブルーチン #----------------------------------------------------------------------------------------------- sub pre { #--- 下準備みたいな感じ -------------------------------------------------------------- my($sec,$min,$hour,$mday,$mon,$year,$wday) = gmtime(time + $Ini{TimeDiff}); $Prt{Date} = sprintf("@{[$year + 1900]}/%02d/%02d(@{[('日','月','火','水','木','金','土')[$wday]]}) %02d:%02d:%02d", $mon + 1,$mday,$hour,$min,$sec); $Prt{Addr} = $ENV{REMOTE_ADDR}; $Prt{Host} = (!$ENV{REMOTE_HOST} || $ENV{REMOTE_HOST} eq $Prt{Addr}) ? (gethostbyaddr(pack('C4', split(/\./, $Prt{Addr})), 2) || $Prt{Addr}) : $ENV{REMOTE_HOST}; ($Prt{RealHost},my $mark) = &getip; $Prt{M_RealHost} = $Prt{RealHost} . $mark; $Prt{Refer} = $ENV{HTTP_REFERER} || 'none'; if($Prt{Refer} ne 'none') { $Prt{Refer} =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; $Prt{Refer} =~ tr/\015\012<>"/ /; } ($Prt{UAgent} = $ENV{HTTP_USER_AGENT} || '') =~ tr/\015\012<>"/ /; } # pre END sub getip { #--- 漏れを取得 -------------------------------------------------------------------- # ホスト名の形で漏れてるのは見ればわかるから無理して拾わなくてもいいかも my $spill = ($ENV{HTTP_FORWARDED} && $ENV{HTTP_FORWARDED} =~ /.*\s($Ini{Addr_RE})/) ? $1 : ($ENV{HTTP_FORWARDED} && $ENV{HTTP_FORWARDED} =~ /.*\sfor\s([\w\.\-]+)/i) ? $1 : ($ENV{HTTP_FROM} && $ENV{HTTP_FROM} =~ /($Ini{Addr_RE})/) ? $1 : ($ENV{HTTP_FROM} && $ENV{HTTP_FROM} =~ /\-\@([\w\.\-]+)/) ? $1 : ($ENV{HTTP_CLIENT_IP} && $ENV{HTTP_CLIENT_IP} =~ /($Ini{Addr_RE})/) ? $1 : ($ENV{HTTP_CLIENT_IP} && $ENV{HTTP_CLIENT_IP} =~ /^([\dA-F]{2})([\dA-F]{2})([\dA-F]{2})([\dA-F]{2})/i) ? join('.', hex($1),hex($2),hex($3),hex($4)) : ($ENV{HTTP_REMOTE_HOST} && $ENV{HTTP_REMOTE_HOST} =~ /($Ini{Addr_RE})/) ? $1 : ($ENV{HTTP_REMOTE_HOST_WP} && $ENV{HTTP_REMOTE_HOST_WP} =~ /($Ini{Addr_RE})/) ? $1 : ($ENV{HTTP_X_LOCKING} && $ENV{HTTP_X_LOCKING} =~ /($Ini{Addr_RE})/) ? $1 : ($ENV{HTTP_VIA} && $ENV{HTTP_VIA} =~ /.*\s($Ini{Addr_RE})/) ? $1 : $ENV{HTTP_SP_HOST} ? ($ENV{HTTP_SP_HOST} =~ /($Ini{Addr_RE})/) ? $1 : $ENV{HTTP_SP_HOST} : ''; # X_FORWARDED_FOR は別扱い my $xspill = ($ENV{HTTP_X_FORWARDED_FOR} && $ENV{HTTP_X_FORWARDED_FOR} =~ /($Ini{Addr_RE})/) ? $1 : ''; # 漏れを検証 my($t_hostip, $mk) = &look($spill) if($spill); # X_FORWARDED_FOR 以外の漏れを見る my($t_xhostip,$xmk) = &look($xspill) if($xspill); # X_FORWARDED_FOR の漏れを見る # X_FORWARDED_FOR には虚偽の値が入っていることがしばしばあるので 他の漏れを優先する # ただし他が虚偽(△)で X_FORWARDED_FOR の漏れが本物(☆)っぽければそっちが採用される return($t_hostip, $mk) if($t_hostip && $mk eq ' ☆'); # ☆有 X_FORWARDED_FOR 以外の漏れ return($t_xhostip,$xmk) if($t_xhostip && $xmk eq ' ☆'); # ☆有 X_FORWARDED_FOR の漏れ return($t_hostip, $mk) if($t_hostip && $mk ne ' △'); return($t_xhostip,$xmk) if($t_xhostip && $xmk ne ' △'); return($t_hostip, $mk) if($t_hostip); return($t_xhostip,$xmk) if($t_xhostip); return($Prt{Host},''); sub look { #--- IPアドレスであればホストに変換 + 簡単な真偽性チェック ---------------------- my($susp,$doubtmk) = @_; $susp =~ tr/:,;\015\012//d; $susp =~ s/<.*?>//g; if($susp =~ /^$Ini{Addr_RE}$/) { # ローカル or フェイクっぽいアドレスは△印 $doubtmk = ' △' if($susp =~ /^(?:0|10|127|172\.(?:1[6-9]|2[0-9]|3[01])|192\.168|255)\.|\.(?:0|255)$/); $susp = gethostbyaddr(pack('C4', split(/\./, $susp)), 2) || $susp; } # REMOTE_HOST と別でjpドメインなら漏れっぽいので☆印 $doubtmk = ' ☆' if($susp ne $Prt{Host} && $susp =~ /\.jp$/i && !$doubtmk); return($susp,$doubtmk); } # look END } # getip END sub html { #--- HTML出力 ----------------------------------------------------------------------- my($r) = $0 =~ m|([^/]+)$|; # 別に設置したリダイレクタがあるならそれを指定しても可 my $your_real_host = $Prt{M_RealHost}; $your_real_host =~ s/△$/(Local or Fake?)/; $your_real_host =~ s/☆$/(Spill?)/; # ホスト名とそれを含む「あなたのプロバイダ…」 my($shost) = &shrink($Prt{Host}); my($srhost,$your_home) = &shrink($Prt{RealHost}); #「あなたのホスト」で proxy っぽいやつは強調表示(やりすぎかも) my $your_host = $Prt{Host}; if($your_host =~ s#(webcache|delegate|gatekeeper|gateway|firewall|proxy|prox|anonymizer|cache|squid|flow|fire-w.*?\b|^bbs|^http|^www|^w3\b|^host|^dns|^web|^dummy|^prx|^ftp|^mail|^news|^cgi|^gate|^server|^pop|^smtp|^secure|^system|^relay|^serv\b)(\d*)#$1$2#i || $your_host =~ s#\b(dns|anon|ns|sv|fw|dn|gw|cf|fs|wc)(\d*)\b#$1$2#i) {} # 上の方が優先 # おまけ追加 - アノニマイザ系(暫定:変更・削除可).. elsif($your_host =~ /^209\.114\.223\.1(?:39|40)$/) { $your_host = "$your_host"; $your_real_host.= ' (net HUSH?)'; } elsif($your_host =~ /^64-243-193-9[67]\.wireweb\.net$/) { $your_host = "$your_host"; $your_real_host.= ' (schematic.org?)'; } # ..おまけ追加分ここまで # jpドメインじゃない・数字が含まれていない $your_host = "$your_host" if($your_host !~ /\.jp$/i || $your_host !~ /\d/); # HTTP_CONNECTION に値が無ければ (none) を入れる $ENV{HTTP_CONNECTION} ||= '(none)'; $Ini{Title}.= '+' if($Ini{OPTCheck} == 2); my %color = ( # 基本色設定 # 背景, 文字1, 文字2, リンク(未訪問), 訪問済みのリンク, 選択中のリンク back => '#d6dadc', text1 => '#333333', text2 => '#666666', link => '#1111af', vlink => '#6666af', alink => '#1111ee', # 強調表示するセル, 強調表示する文字, テーブルの縁 em => '#eaecec', warn => '#993333', border => '#667788' ); my $body = qq(
); my $perl_ver = $^V ? (sprintf "%vd", $^V) : $]; (my $perl_info = "Perl@{[`which perl` ? (' ' . `which perl`) : '']} [v$perl_ver]") =~ tr/\015\012//d; # おまけ # xrea.com バナー my $xrea_ad = ($Ini{XreaIns} && $ENV{SERVER_NAME} && $ENV{SERVER_NAME} =~ /xrea\.com/i) ? <<"_XREA_" : '';" : ''; my $nobanner = ($xrea_ad || (!$no_kill_banner && $ENV{SERVER_NAME} && $ENV{SERVER_NAME} =~ /(?:netfirms|xrea)\.com/i)) ? '' : ''; my($status,$nl) = $Ini{NPH} ? ('HTTP/1.0',"\015\012") : ('Status:',"\012"); # 出力開始 print "$status 200 OK$nl", "Connection: close$nl", "Content-Type: text/html; charset=Shift_JIS$nl", "Content-Language: ja$nl", "Cache-Control: no-cache$nl", "Pragma: no-cache$nl$nl", <<"_HTML_"; $nobanner
@{[$Ini{OPTCheck} ? qq(\n) : '']}
$body $Ini{Title}
ANSI Whois Gateway : ホスト ♪@{[($shost ne $srhost) ? qq( ~ ) : ' ']} IPアドレス ♪ BW Whois : ♪@{[($shost ne $srhost) ? qq( ~ ) : ' ']} ♪ あなたのプロバイダのホームページ ? ♪ |
[$Prt{Date}] $Prt{Host} ($Prt{M_RealHost}) / $Prt{Addr} 〜 @{[($Prt{Refer} =~ /^http/i) ? qq($Prt{Refer}) : $Prt{Refer}]} - $Prt{UAgent} |
_HTML_
print "# その他...
\n" if($Ini{OPTCheck}); # 時間のかかる場合があるので先にこれだけ
print <<"_OPT_" if($Ini{OPTCheck});
@{[($Ini{OPTCheck} == 2) ? "SNMP - @{[&snmp($Prt{Addr})]} " : '']} CSS = off (or not fully supported) |
_OPT_ print qq(
\n
は | としてもいいが 旧い Netscape での見映えのためにこうしておく print qq( |
$key | ), qq($ENV{$key} |
$key | ), qq($ENV{$key} |
$key | ), qq($ENV{$key} |
$key | ), qq($ENV{$key} |
$key | ), qq($ENV{$key} |
$key | ), qq($ENV{$key} # Gabrienai |
$key | ), qq($ENV{$key} |
$key | ), qq($ENV{$key} |
$key | ), qq($ENV{$key} |
\n$xrea_ad$copy\n$bodyend\n