#!/usr/bin/perl # 1999 (C) MasA & SUMi # 1999 8 初版 #========= # 設定 #========= $cgi_path = '/bbs'; #このCGIのファイル名 $cgi_name = 'tkbbs.cgi'; #dataディレクトリ名 $data_dir = 'data'; $cgi_url = "$cgi_path\/$cgi_name"; #REFERERを確認する? $ref_chk = 0; #最大ログ保存件数 $max = 500; #1ページに表示する件数 $page_per = 20; #本文の書き込みサイズの制限(バイト)。0で無制限 $max_size = 512; require './jcode.pl'; $lockfile = 'tok2.loc'; $logfile = 'tok2.log'; #==設定終了== # ここから送信データ読み出し&不正アクセスのチェック if( $ENV{'REQUEST_METHOD'} eq "POST" ){ read( STDIN, $buf, $ENV{'CONTENT_LENGTH'} ); } else{ $buf = $ENV{'QUERY_STRING'}; } if( $buf eq "" ){ &readlog(); &html(); exit; } # ここからデータ読み出し&ハッシュ化 @pairs = split( /&/, $buf ); foreach $pair ( @pairs ){ ( $name, $value ) = split( /=/, $pair ); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); $value =~ s/\t/ /g; $value =~ s//>/g; #本文はこの時点で改行を
へ変換 if( $name eq 'value' ){ $value =~ s/\r\n/
/g; } $value =~ s/\r/ /g; $value =~ s/\n/ /g; $FORM{ $name } = $value; } # クッキー $cookies = $ENV{'HTTP_COOKIE'}; @pairs = split(/;/,$cookies); foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair,2); $name =~ s/ //g; $DUMMY{$name} = $value; } @pairs = split(/,/,$DUMMY{$reload}); foreach $pair (@pairs) { ($name,$value) = split(/:/,$pair,2); $COOKIE{$name} = $value; } #2ページ目以降の表示の場合。 if( $FORM{'page'} ne '' ){ &readlog; &html; exit; } #ファイルを開く前に記入事項に漏れがないか確認 if( $FORM{'name'} eq "" || $FORM{'subject'} eq "" || $FORM{'value'} eq "" || $FORM{'url'} eq "http://" || $FORM{'url'} eq "" ){ &error( '記入漏れ', '名前、タイトル、本文、URLは必ず入力してください。' ); } #メールのチェック if( $FORM{'mail'} ne '' && !($FORM{'mail'} =~ /(.*)\@(.*)\.(.*)/) ){ &error('入力ミス', 'メールアドレスの形式が間違っています。' ); } if( $FORM{'url'} !~ /http:\/\/new(.*)tok2\.com(.*)/ && $FORM{'url'} !~ /http:\/\/sak2(.*)tok2\.com(.*)/ && $FORM{'url'} !~ /http:\/\/www(.*)sak2\.com(.*)/ ){ &error('さくさく掲示板','さくさく以外のサイトの宣伝は禁止しています'); } #$FORM{'url'} =~ s/new/sak2\-/g; # 本文のサイズ確認 if( $max_size ){ $value_size = length( $FORM{'value'} ); if( $value_size > $max_size ){ &error( '入力ミス', "最大記録サイズ$max_sizeバイトを超えています。 現在$value_sizeバイトです。" ); } } # ホスト $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($host eq '') { $host = $addr; } if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; } # ここから実際にログの追加作業開始 # 日付を求める ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime( time ); @wday_array = ( '日', '月', '火', '水', '木', '金', '土' ); # クッキー用 ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + 30*24*60*60); # 年の表示を消して2000年問題対応(汗 $date_now = sprintf( "%01d月%01d日(%s)%02d時%02d分", $mon +1, $mday, $wday_array[$wday], $hour, $min ); &lockcheck; # lockファイル作成 if( !open( LOCKFILE,">$data_dir\/$lockfile" )){ &error( 'エラー','システムエラーlock' ); } &readlog; # 連続2重投稿チェック ( $loghost ) = ( split( '\t',$lines[ 0 ] ))[ 6 ]; if( $host eq $loghost ){ ( $mtime ) = ( stat( "$data_dir\/$logfile" ))[ 9 ]; if ( $mtime > time() - 10 ) { close( LOCKFILE ); unlink( "$data_dir\/$lockfile" ); &error( 'エラー','短期間の2重投稿は禁止しています' ); } } #ログ保存件数が最大に達していれば一番古いログを削除 if ( $max <= $#lines + 1 ) { pop( @lines ); } unshift( @lines,"$date_now\t$FORM{'name'}\t$FORM{'mail'}\t$FORM{'url'}\t$FORM{'subject'}\t$FORM{'value'}\t$host\t$addr\n" ); if( !open( LOGFILE,">$data_dir\/$logfile" )){ &error( 'エラー','LOGエラー' ); } print LOGFILE @lines; close( LOGFILE ); &html; exit; #=========== # readlog #=========== sub readlog { # ログ読みこみ if( !open( READ,"$data_dir\/$logfile" )){ &error( 'エラー','システムエラーlog' ); } @lines = ; close( READ ); } #============ # lockcheck #============ sub lockcheck { # ロック調査 if( -e "$data_dir\/$lockfile" ){ $retry = 3; while( $retry-- ){ sleep( 2 ); if( ! -e "$data_dir\/$lockfile" ){ return; } } &error( 'アクセス過多','ただいま大変混み合っています。少したってもう一 度投稿してください' ); } } #============ # sub html #============ sub html { #&setcookie; if ( $FORM{'page'} eq '' ) { $page = 0; } else{ $page = $FORM{'page'} + 1; } $page_end = $page + $page_per - 1; if ($page_end > $#lines) { $page_end = $#lines; } unlink( "$data_dir\/$lockfile" ); print "Content-type: text/html\n\n"; #print "Set-Cookie: $cgi_path\/$data_dir\/$htmlfile=$cook; expires=$date_gmt\n"; # ヘッダ print "\n"; print "さくさくHP宣伝掲示板\n"; # ボディー print "\n"; # 中身 print "
\n"; print "\n"; print "\n"; print "

\n"; print "『さくさく』ユーザー専用ホームページ宣伝掲示板

"; &print_banner(); print "
\n"; # メニューバー print "トップページ登録する


"; # フォーム print "
\n"; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print ""; print "
"; print ""; print ""; print "お名前"; print ""; print ""; print "
"; print ""; print ""; print "メール"; print ""; print ""; print "
"; print ""; print ""; print "タイトル"; print ""; print ""; print "
"; print ""; print ""; print "URL"; print ""; print ""; print "
"; print ""; print ""; print "内容【記入どおりに表\示されますので改行を入れて下さい】"; print "
"; print ""; print "
"; print ""; print ""; print "
"; print "
"; print "
\n"; foreach ( $page .. $page_end ){ ( $date_now, $yourname, $yourmail, $yoururl, $yoursubject, $yourvalue, $yourhost, $youraddr ) = split( /\t/, $lines[$_] ); $yoururl =~ s/new/sak2\-/g; $yoururl =~ s/sak2\-1\.tok2\.com/www\.sak2\.com/g; print "$yoursubject
\n"; print "投稿者:"; if( $yourmail ne '' ){ print "$yourname"; } else{ print "$yourname"; } print " $date_now"; print "
$yourvalue
\n"; if( $yoururl ne '' ){ print "
$yoururl
"; } print "

\n"; } if( $page_end != $#lines){ print "
\n"; print "

\n"; } print "
"; print "トップページ登録する


"; print "お問い合わせはこちらまで。
Copyright(C) by sak2. ALL RIGHTS RESERVED.
"; print "
\n"; } #========== # error #========== sub error { print "Content-type: text/html\n\n"; print "CGIエラーメッセージ".$_[0]."\n"; print "
\n"; print "

$_[0]

\n"; print "

$_[1]

\n"; print "

ブラウザの[戻る]ボタンを押して前の画面に移動してください。

\n"; print "
\n"; exit; } sub setcookie { $y0="Sunday"; $y1="Monday"; $y2="Tuesday"; $y3="Wednesday"; $y4="Thursday"; $y5="Friday"; $y6="Saturday"; @youbi = ($y0,$y1,$y2,$y3,$y4,$y5,$y6); $m0="Jan"; $m1="Feb"; $m2="Mar"; $m3="Apr"; $m4="May"; $m5="Jun"; $m6="Jul"; $m7="Aug"; $m8="Sep"; $m9="Oct"; $m10="Nov"; $m11="Dec"; @monthg = ($m0,$m1,$m2,$m3,$m4,$m5,$m6,$m7,$m8,$m9,$m10,$m11); $date_gmt = sprintf("%s\, %02d\-%s\-%04d %02d:%02d:%02d GMT",$youbi[$wdayg],$mdayg,$monthg[$mong],$yearg +1900,$hourg,$ming,$secg); $cook="name\:$FORM{'name'}\,email\:$FORM{'email'}"; $COOKIE{'name'} = $FORM{'name'}; $COOKIE{'email'} = $FORM{'email'}; } sub print_banner() { return; print <<"_EOF_"; _EOF_ }