#!/usr/local/bin/perl use strict; require 'jcode.pl'; ### bbs.cgi ver 2.31 (2001/08/22) # システム情報 use vars qw($KEEPLOGCOUNT); $KEEPLOGCOUNT = 4096; # ログファイル保持数(システム設定) #================================================== # システム関連(タイムゾーン・シグナル) #================================================== #タイムゾーンをセットする { $ENV{'TZ'} = "JST-9"; } #シグナル対処関数 sub SigExit { exit(0); } #対応シグナル { $SIG{'PIPE'} = $SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = "SigExit"; } #================================================== # 初期情報の取得(POST) #================================================== { use vars qw(%FORM); use vars qw($buffer); my (@pairs, $name, $value, $check); $check = '(?:^|[\0-\200\240-\337])(?:[\201-\237\340-\374]{2})*'; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @pairs = split /&/,$buffer;$buffer=undef; foreach (@pairs) { ($name, $value) = split /=/; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('H2',$1)/eg; $value =~ s/</g; $value =~ s/>/>/g; $value =~ s/\r\n|\r|\n//g; $value =~ s/^(?:)+//g; $value =~ s/(?:)+$//g; $value =~ s/(?:){4,}//g; $value =~ s/($check)[\201-\237\340-\374]/$1/g; $buffer .= $value; $FORM{$name} = $value; } } if((&jcode'getcode(*buffer))[1] ne 'sjis'){ DispError("ERROR!","ERROR:Sjisで書いてね。。。"); } if($FORM{'submit'} !~ /^[\x81-\x95|\xE0-\xEF]/ || length($FORM{'submit'}) < 6){ DispError("ERROR!","ERROR:文字化けしちゃうよ。。。"); } if(length($FORM{'time'})<9){ DispError("ERROR!","ERROR:フォーム情報が不正です!"); } } #================================================== # 設定 #================================================== { use vars qw(%SETTING); use vars qw(%FLAG); use vars qw($HOST); use vars qw($DATE); use vars qw($ID); # 各種PATH生成 use vars qw($WWWPATH); use vars qw($PATH); use vars qw($DATPATH); use vars qw($TEMPPATH); use vars qw($IMODEPATH); $FORM{'bbs'} =~ s/\0//g; $PATH = "../" . $FORM{'bbs'} . "/"; $DATPATH = $PATH . "dat/"; $TEMPPATH = $PATH . "html/"; $IMODEPATH = $PATH . "i/"; use vars qw($NOWTIME); $NOWTIME = time; $FLAG{'FROM'}=$FORM{'FROM'}; $FLAG{'mail'}=$FORM{'mail'}; } #================================================== # 初期情報の取得(設定ファイル) #================================================== { # 設定ファイルを読む my ($m_pass,$m_key,$m_value); $m_pass = $PATH . "SETTING.TXT"; if(-e $m_pass){ open(FILE,$m_pass); foreach (){ chop; ($m_key,$m_value) = split /=/; $SETTING{$m_key} = $m_value; } close(FILE); }else{ # 設定ファイルがない(ERROR) DispError("ERROR!","ERROR:ユーザー設定が消失しています!"); } # 欠落情報の補完 unless($SETTING{'BBS_THREAD_NUMBER'}){$SETTING{'BBS_THREAD_NUMBER'}=20;} unless($SETTING{'BBS_CONTENTS_NUMBER'}){$SETTING{'BBS_CONTENTS_NUMBER'}=10;} unless($SETTING{'BBS_LINE_NUMBER'}){$SETTING{'BBS_LINE_NUMBER'} = 30;} unless($SETTING{'BBS_MAX_MENU_THREAD'}){$SETTING{'BBS_MAX_MENU_THREAD'}=100;} unless($SETTING{'BBS_BG_COLOR'}){$SETTING{'BBS_BG_COLOR'}="#FFFFFF";} unless($SETTING{'BBS_MENU_COLOR'}){$SETTING{'BBS_MENU_COLOR'}="#CCFFCC";} unless($SETTING{'BBS_MAKETHREAD_COLOR'}){$SETTING{'BBS_MAKETHREAD_COLOR'}="#CCFFCC";} unless($SETTING{'BBS_THREAD_COLOR'}){$SETTING{'BBS_THREAD_COLOR'}="#EFEFEF";} unless($SETTING{'BBS_SUBJECT_COLOR'}){$SETTING{'BBS_SUBJECT_COLOR'}="#FF0000";} unless($SETTING{'BBS_TEXT_COLOR'}){$SETTING{'BBS_TEXT_COLOR'}="#000000";} unless($SETTING{'BBS_NAME_COLOR'}){$SETTING{'BBS_NAME_COLOR'}="#008800";} unless($SETTING{'BBS_LINK_COLOR'}){$SETTING{'BBS_LINK_COLOR'}="#0000FF";} unless($SETTING{'BBS_ALINK_COLOR'}){$SETTING{'BBS_ALINK_COLOR'}="#FF0000";} unless($SETTING{'BBS_VLINK_COLOR'}){$SETTING{'BBS_VLINK_COLOR'}="#660099";} unless($SETTING{'BBS_TITLE_COLOR'}){$SETTING{'BBS_TITLE_COLOR'}="#000000";} unless($SETTING{'BBS_SUBJECT_COUNT'}){$SETTING{'BBS_SUBJECT_COUNT'}=64;} unless($SETTING{'BBS_NAME_COUNT'}){$SETTING{'BBS_NAME_COUNT'}=64;} unless($SETTING{'BBS_MAIL_COUNT'}){$SETTING{'BBS_MAIL_COUNT'}=64;} unless($SETTING{'BBS_MESSAGE_COUNT'}){$SETTING{'BBS_MESSAGE_COUNT'}=4096;} #unless($SETTING{'BBS_THREAD_TATESUGI'}){$SETTING{'BBS_THREAD_TATESUGI'}=5;} unless($SETTING{'timecount'}){$SETTING{'timecount'}=15;} unless($SETTING{'timeclose'}){$SETTING{'timeclose'}=15;} unless($SETTING{'BBS_WAIT_MINUTE'}){$SETTING{'BBS_WAIT_MINUTE'}=3;} unless($SETTING{'BBS_MAX_RES_COUNT'}){$SETTING{'BBS_MAX_RES_COUNT'}=1000;} unless($SETTING{'BBS_MAX_RES_SIZE'}){$SETTING{'BBS_MAX_RES_SIZE'}=500;} } #================================================== # 初期情報の取得(日付) #================================================== { # 日付と時間をげとする my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst); my ($myear, $mtd, $dday, $uruu); my ($wmon, $wmday, $wwday, $wdday); my ($nmon, $nday, $dtime, $nhour, $nmin, $nsec); my ($qyear, $quruu, $qmon, $qday, $qrokuyou); ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($NOWTIME); $myear = $year + 1900; $wday = ("日", "月", "火", "水", "木", "金", "土")[$wday]; if ( $SETTING{'BBS_LUNISOLAR_CALENDAR'} ) { # 旧暦の計算(qreki.plが必要) # qreki.plの入手先 → http://www3.biwako.ne.jp/~nobuaki/qreki/ require './qreki.pl'; ($qyear, $quruu, $qmon, $qday) = &qreki::calc_kyureki($myear, $mon + 1, $mday); $qrokuyou = ( $qmon + $qday ) % 6; $quruu = ("", "閏")[$quruu]; $qrokuyou = ("大安", "赤口", "先勝", "友引", "先負", "仏滅")[$qrokuyou]; } if (( $SETTING{'BBS_WORLD_CALENDAR'} ) || ( $SETTING{'BBS_DECIMAL_CALENDAR'} )) { # 閏年の判定 if (( $myear % 4 == 0 ) && ( $myear % 100 != 0 ) || ( $myear % 400 == 0 )) { $uruu = 1; } else { $uruu = 0; } # 通日の計算 ( 0 〜 364 ( 平年 ), 365 ( 閏年 ) ) $mtd = ( 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 )[$mon]; $dday = $mtd + $mday - 1; if (( $uruu == 1 ) && ( $mon >= 2 )) { $dday++; } } if ( $SETTING{'BBS_WORLD_CALENDAR'} ) { # 世界暦の計算 if (( $uruu == 1 ) && ( $dday >= 183 )) { $wdday = $dday - 1; } else { $wdday = $dday; } if (( $uruu == 1 ) && ( $dday == 182 )) { $wmon = 6; $wmday = 31; $wwday = "世"; } elsif (( $uruu == 1 ) && ( $dday == 365 ) || ( $uruu == 0 ) && ( $dday == 364 )) { $wmon = 12; $wmday = 31; $wwday = "世"; } else { $wmon = int ( $wdday / ( 91 / 3 )) + 1; $wmday = int ( $wdday - ( $wmon - 1 ) * ( 91 / 3 )) + 1; $wwday = ("日", "月", "火", "水", "木", "金", "土")[($wdday % 7)]; } } if ( $SETTING{'BBS_DECIMAL_CALENDAR'} ) { # 10進の暦法の計算 if ( $dday == 365 ) { $nmon = 9; $nday = 36; } else { $nmon = int ( $dday / 36.5 ); $nday = int ( $dday - $nmon * 36.5 ); } # 10進の時法の計算 $dtime = ( $hour * 3600 + $min * 60 + $sec ) / 0.864; $nhour = int ( $dtime / 10000 ); $nmin = int (( $dtime - $nhour * 10000 ) / 100 ); $nsec = int ( $dtime - $nhour * 10000 - $nmin * 100 ); } # 日付・時間の合成 $DATE = sprintf("%04d/%02d/%02d(%s) %02d:%02d", $myear, $mon + 1, $mday, $wday, $hour, $min); if ( $SETTING{'BBS_LUNISOLAR_CALENDAR'} ) { $DATE .= sprintf(" 旧暦:%04d/%s%02d/%02d(%s) %02d:%02d", $qyear, $quruu, $qmon, $qday, $qrokuyou, $hour, $min); } if ( $SETTING{'BBS_WORLD_CALENDAR'} ) { $DATE .= sprintf(" 世界暦:%04d/%02d/%02d(%s) %02d:%02d", $myear, $wmon, $wmday, $wwday, $hour, $min); } if ( $SETTING{'BBS_DECIMAL_CALENDAR'} ) { $DATE .= sprintf(" 十\進暦:%04d/%01d/%02d #%01d%02d", $myear, $nmon, $nday, $nhour, $nmin); } # ID my $idnum = substr($ENV{'REMOTE_ADDR'}, 8); my $idcrypt = substr(crypt($idnum * $idnum, substr($DATE, 8, 2)), -8); $ID = " ID:".$idcrypt; # 有効期限をつくる my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst); my $exp = 24 * 60 * 60; $exp *= 30; #有功日数を乗じる ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime($NOWTIME + $exp); $wday = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[$wday]; $mon = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mon]; $year = $year+1900;$mday = "0$mday" if ($mday < 10); $FLAG{'expires'} = "$wday, $mday-$mon-$year 00:00:00 GMT"; } #================================================== # ホスト取得 #================================================== { $FLAG{'PROXY'} = 0; my $host2; $HOST = $ENV{'REMOTE_ADDR'}; if ($HOST =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/) { $HOST = gethostbyaddr(pack('c4',split(/\./, $HOST)), 2) || $HOST; } if ($ENV{'HTTP_VIA'} =~ s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/) { $host2 = $ENV{'HTTP_VIA'}; } if ($ENV{'HTTP_X_FORWARDED_FOR'} =~ s/^(\d+)\.(\d+)\.(\d+)\.(\d+)(\D*).*/$1.$2.$3.$4/) { $host2 = $ENV{'HTTP_X_FORWARDED_FOR'}; } if ($ENV{'HTTP_FORWARDED'} =~ s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/) { $host2 = $ENV{'HTTP_FORWARDED'}; } $host2 = gethostbyaddr(pack('c4', split(/\./, $host2)), 2); $HOST .= "[$host2]" if ($host2); if ($HOST =~ /proxy/i && $host2 eq '') { $FLAG{'PROXY'} = 1; } if ($ENV{'HTTP_USER_AGENT'} =~ /ANONYMIZER/i) { $FLAG{'PROXY'} = 1; } if ($host2){ $FLAG{'PROXY'} = 1; } } #================================================== # i-mode検出 #================================================== { $FLAG{'imode'}=0; if($FORM{'submit'} eq 'かきこむ'){$FLAG{'imode'}=1;} if($ENV{'HTTP_USER_AGENT'} =~ /DoCoMo\//){$FLAG{'imode'}=1;} } #================================================== # パス情報(名前) #================================================== { $FLAG{'cap'}=''; if (-e "../caps.cgi" && $FORM{'mail'} =~ /#.+/) { my ($id1,$name1,$pass1); open(IN,"../caps.cgi"); foreach () { chop; ($id1,$name1,$pass1) = split /<>/; if($FORM{'mail'} =~ /#$pass1/){ $FLAG{'cap'} = "$name1 ★";$ID=" ID:???"; last; } } close(IN); } } #================================================== # アクセス規制 #================================================== { # 不正PROXY使用ですか、、、? # プロキシ制限の実施 if($FLAG{'PROXY'} == 1 && $SETTING{'BBS_PROXY_CHECK'} eq "checked") { DispError("ERROR!","ERROR:PROXY規制中!"); } if($HOST !~/jp$/ && $SETTING{'BBS_OVERSEA_PROXY'} eq "checked") { DispError("ERROR!","ERROR:PROXY規制中!"); } if($HOST !~ /jp$/ && $FORM{'subject'} ne '' && $SETTING{'BBS_OVERSEA_THREAD'} eq "checked") { DispError("ERROR!","jpドメインからスレッド立ててください"); } #-------------------------------ユーザー設定が異常です! if(-e "../z$FORM{'bbs'}/uerror.cgi"){ open (IN,"../$FORM{'bbs'}/uerror.cgi"); foreach (){ chop; if ($HOST =~ /$_/) { DispError("ERROR!","ユーザー設定が異常です!"); } } close(IN); } #-------------------------------リモートホストを公開します。 if (-e "../$FORM{'bbs'}/chubo.cgi" && !($SETTING{'BBS_NEWSUBJECT'} && $FORM{'subject'})){ open (IN,"../$FORM{'bbs'}/chubo.cgi"); foreach (){ chop; if ($HOST =~ /$_/) { $FORM{'MESSAGE'} .= 'あなたのレスまたはスレッドの内容について問題があり、'; $FORM{'MESSAGE'} .= '管理人からの警告にもかかわらず内容に改善が見られませんでしたので、'; $FORM{'MESSAGE'} .= "あなたのリモートホスト($HOST)を公開します。"; $FORM{'MESSAGE'} .= '解除申請は事務所にお願いします。'; } } close(IN); } #-------------------------------管理人から警告します。 if (-e "../$FORM{'bbs'}/keikoku.cgi" && !($SETTING{'BBS_NEWSUBJECT'} && $FORM{'subject'})){ open (IN,"../$FORM{'bbs'}/keikoku.cgi"); foreach (){ chop; if ($HOST =~ /$_/) { $FORM{'MESSAGE'} .= 'あなたのレスまたはスレッドの内容について、管理人から警告します。'; $FORM{'MESSAGE'} .= '内容に改善が見られない場合、あなたのリモートホストが公開されます。'; $FORM{'MESSAGE'} .= '解除申請は事務所にお願いします。'; } } close(IN); } #-------------------------------個別の規制 if (-e "../$FORM{'bbs'}/arashi.cgi" && !($SETTING{'BBS_NEWSUBJECT'} && $FORM{'subject'})){ open (IN,"../$FORM{'bbs'}/arashi.cgi"); foreach (){ chomp; my ($arashikey , $arashihost); ($arashikey , $arashihost) = (split /<>/ , $_); if (($FORM{'key'} eq $arashikey) && ($HOST =~ /$arashihost/)) { DispError("ERROR!","荒らしさんの使ったリモートホストです。。。"); } } close(IN); } } #================================================== # 情報の修正(名前) #================================================== { #名前がなければ名無しさん(かちゅ〜しゃ使用者とそれ以外で振り分け) $FLAG{'NONAME'} = 0; unless($FORM{'FROM'}){ if (($ENV{'HTTP_USER_AGENT'} =~ /Katjusha/) || ($ENV{'HTTP_USER_AGENT'} =~ /kage/)) { $FORM{'FROM'} = $SETTING{'BBS_NONAME_NAME_KA'}; } else { $FORM{'FROM'} = $SETTING{'BBS_NONAME_NAME'}; } $FLAG{'NONAME'} = 1; if ($FLAG{'cap'}) {$FORM{'FROM'}='';} } if (($ENV{'HTTP_USER_AGENT'} !~ /Katjusha/) && ($ENV{'HTTP_USER_AGENT'} !~ /kage/)) { if ($FORM{'FROM'} eq $SETTING{'BBS_NONAME_NAME_KA'}) { $FORM{'FROM'} = $SETTING{'BBS_NONAME_NAME'}; } } } #================================================== # 情報の修正(キー) #================================================== # サブジェクトがある場合はキーを現在に設定 # サブジェクト&キーがない場合はエラー # サブジェクトが無くキーがある場合はキーを受けとる { if($FORM{'subject'}){ $FORM{'key'} = $NOWTIME; }else{ if(defined($FORM{'key'})){ # キーが数字じゃない場合ばいばい! if($FORM{'key'} =~ /\D/){ DispError("ERROR!","ERROR:キー情報が不正です!"); } }else{ if ($SETTING{'BBS_PASSWORD_CHECK'} eq "checked"){ print "Content-type: text/html; charset=shift_jis\n\n"; print < $SETTING{'BBS_TITLE'} EOF if($SETTING{'BBS_TITLE_PICTURE'}){ print ""; if($SETTING{'BBS_TITLE_LINK'}){ print ""; } print ""; if($SETTING{'BBS_TITLE_LINK'}){ print ""; } print ""; }else{ print ""; if($SETTING{'BBS_TITLE_LINK'}){ print ""; } # print "$SETTING{'BBS_TITLE'}"; if($SETTING{'BBS_TITLE_LINK'}){ print ""; } print ""; } print "\n"; print < $SETTING{'BBS_TITLE'} EOF if ($SETTING{'BBS_PROXY_CHECK'} eq "checked") { print " ■PROXY規制中■\n"; } print " \n"; print " "; &HTM("../right.txt"); print < EOF &HTM($PATH."head.txt"); print " \n"; print < タイトル: 名前: E-mail(省略可): 内容: EOF &HTM("../bottom.txt"); print "\n\n"; print "\n"; exit; } DispError("ERROR!","ERROR:サブジェクトが存在しません!"); } } } #================================================== # 書き込み確認。 #================================================== { if ($SETTING{'BBS_NEWSUBJECT'} && $FORM{'subject'}){ $FORM{'subject'}=~s/&/&/g;$FORM{'subject'}=~s/"/"/g; $FLAG{'FROM'}=~s/&/&/g;$FLAG{'FROM'}=~s/"/"/g; $FORM{'mail'}=~s/&/&/g;$FORM{'mail'}=~s/"/"/g; $FORM{'MESSAGE'}=~s/&/&/g;$FORM{'MESSAGE'}=~s/"/"/g; if ($FORM{'mail'}=~/hirakata/){&hirakata;} # if ($SETTING{'BBS_HIRAKATA_CHECK'} eq "checked"){&hirakata;} my $message2=$FORM{'MESSAGE'};$FORM{'MESSAGE'} =~ s//\n/g; # my $message2=$FORM{'MESSAGE'};$FORM{'MESSAGE'} =~ s/ /\n/g; print "Content-type: text/html; charset=shift_jis\n\n"; if (!$FLAG{'imode'}){ print < $SETTING{'BBS_TITLE'} 書き込み確認。 書き込みに関して様々なログ情報が記録されています。 公序良俗に反したり、他人に迷惑をかける書き込みは控えて下さい タイトル:$FORM{'subject'} 名前:$FLAG{'FROM'} E-mail(省略可): $FORM{'mail'} 内容:$message2 変更する場合は戻るボタンで戻って書き直して下さい。 EOF exit; } else { print < 書き込み確認。 書き込みに関して様々なログ情報が記録されています。 公序良俗に反したり、他人に迷惑をかける書き込みは控えて下さい タイトル:$FORM{'subject'} 名前:$FLAG{'FROM'} E-mail(省略可): $FORM{'mail'} 内容:$message2 全責任を負うことを承諾して 変更する場合は戻るボタンで戻って書き直して下さい。