#!/usr/bin/perl #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #+++  [ マルチゃん!] #+++ #+++ ・・・・・>>> All Created by Tacky #+++ #+++ ・・・・・>>> Copyright (c) 1999.7 Tacky's Room. All rights reserved.... #+++ #+++ Email >>> tacky2@ops.dti.ne.jp #+++ Homepage >>> http://tackysroom.com/ #+++ #+++ >>> Update-History... #+++ #+++ 2006.06.05(Ver0.95) >> $urllink=2の時、$urerrnm[1]以降がエラーになりませんでした #+++ 2006.05.26(Ver0.94) >> ・セキュリティ追加 #+++ 2004.03.03(Ver0.931 )>> ・不具合対応 #+++ 2004.02.07(Ver0.93 )>> ・セキュリティ強化 #+++ 2001.04.12(Ver0.92) >> 二重登録禁止チェックを追加 #+++ >> Locationヘッダが使えないサーバー対応 #+++ >> ボタンとかCSS指定追加 #+++ 2001.01.18(Ver0.91) >> 戻り先URLを各掲示板毎に設定出来るようにしました<SETファイルで設定します #+++ アイコン不要とした場合の入力フォームのデザインが余りにも醜かったので治療しました。(笑) #+++ 2000.10.09 >> ・DANGER_LISTの初期設定修正 #+++ 2000.07.12 >> ファイルロックが解除されない場合がある不具合修正 #+++ 2000.07.01 >> maruchan1.setの中にテキストカラー(textcolor)の設定が抜けていました・CSSのフォントサイズが反映されていませんでした #+++ 2000.06.16 >> CSS追加・ロック処理見直し・ログファイル保存形式変更(COMMENT欄の改行を
で保存するようにしました)・フォントサイズ指定可・Apache+Netscape文字化け対応 #+++ [name]等に半角スペースを入れると半角スペース以降認識しないバグ修正・アイコン一覧を見やすくしました。 #+++ textcolorやリンクカラーも掲示板設定ファイル(".set"ファイル)側で設定出来るようにしました #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ require './jcode.pl'; #日本語コード変換 $script = "./guest22.cgi"; #このCGIの名前を指定 $method = 'POST'; #METHODの指定(POST又はGET) $sz = '500'; #ログ表示部のtable幅。pixel又は%で指定してね。 #作成する掲示板を設定して下さい # @BBSSELECT = ('ほんわか君(main)','音楽専用','映画専用','ピロウズ専用'); のように設定して下さい。 @BBSSELECT = ('GuestBook Part2'); $logname = './maruchan'; #ログファイルの名前を指定 # ※拡張子「.txt」は省略して下さい。 #  ファイル名は「ログファイル名1〜n(掲示板の数).txt」となります。 $lockfile = './maruchan.lock'; #ロックファイルの名前を指定 #昇進機能を使う場合、投稿者毎の投稿回数を保持するファイルの名前を指定。使わない場合は''として下さい。 $logfile2 = './maruchan_cnt.txt'; #←昇進機能を使う場合 #↓昇進機能を使う場合のみ設定 ### 20061123 mizuho #@rank = ('幼稚園生','小学校低学年','小学校中学年','小学校高学年','中学生','高校生','大学生','大学院生','平社員','課長','部長','社長'); #↓指定した回数で昇進していきます #@rankno = ('0','4','6','8','10','15','20','25','30','50','80','100'); @rank = ('幼稚園生','小学校低学年','小学校中学年','小学校高学年','中学生','高校生','大学生','大学院生','平社員','課長','部長','社長','会長','大臣','王子','皇帝'); #↓指定した回数で昇進していきます @rankno = ('0','4','6','8','10','15','20','25','30','50','80','100','500','1000','5000','10000'); ### #投稿時に背景色及び文字色の選択を行いますか? 'no'の場合は、元メッセージ時・レスメッセージの2色のみの設定。 $color_use = 'yes' ; #$color_useが'no'の場合は設定ファイル(maruchan1.set等)で設定します。 #$color_useが'yes'の場合 #色の指定 #背景色 @COLORS = ('#FFCCCC','#FFFF99','#CCFFFF','#CCFFCC','#CCFF00','#FFCC00','#CCCCFF','#99CCFF','#CCCC66','#990000'); #文字色 @COLORS2 = ('#000000','#666666','#000066','#990000','#999900','#cc3399','#ff0000','#339900','#ffffff'); $datamax = 10000 ; #最大データ保存件数 $pagemax = 10 ; #1ページ内に表示する件数 $password = '3417'; #メンテナンス用パスワード(管理者用) $tag = 'no'; #タグ許可(yes,no) $resflag = 'yes' ; #最新レスを先頭に表示する?(yes,no) $agentflag = 'no' ; #投稿者の使用ブラウザ・OSを表示する?(yes.no) $hostflag = 'no' ; #リモートホストを表示する?(yes.no) $buttonflag = '1' ; #掲示板の選択方法(1:プルダウンリスト 2:ボタン 3:アイコン 4:外部から指定) #↑が3(アイコン)の場合、以下に掲示板の個数分の画像のパスを設定して下さい。 $button_gif[0] = './ccdog1.gif'; $button_gif[1] = './cccat1.gif'; $button_gif[2] = './ccpanda1.gif'; $button_gif[3] = './ccbear1.gif'; #<<<↓の画像はそのまま使用してね。パスだけ修正。 $gif_spacer = 'http://www.zensoku.info/guest2/spacer.gif'; #ダミー透過画像 #掲示板荒らし対策。排除したいプロバのアドレスを設定して下さい。 # "xxx?.com"とした場合、"xxx1.com","xxx2.com"等、「?」の部分が文字列1つと判断します # "xxx*.com"とした場合、"xxx1.com","xxx12345.com等、「*」の部分が0個以上の文字列と判断します。 # 例:@DANGER_LIST=("xxx.com","yyy.com","zzz*.or.jp"); @DANGER_LIST=("","",""); #掲示板荒らし対策その2。メッセージ最大文字数を指定。特に設定しない場合は、''として下さい。 $maxword = '1000' ; #■■■ Ver0.86より追加↓ ■■■ $s_col = 70 ; #メッセージ欄の桁数 $s_row = 10 ; #メッセージ欄の行数 #投稿時のパスワードをcrypt関数を使用する(暗号化) #crypt関数が利用出来ない場合もありますので、投稿時にエラーになる場合は、「0:使用しない」にして下さいね。 $ango = 1 ; #0:使用しない 1:使用する (推奨:1:使用する) #アイコン一覧を表示する際、1行にアイコンを何個表示します? $icon_line = 5 ; #←の場合、5個表示したら改行するって事です。 #■■■ Ver0.86より追加↑ ■■■ #■CSSの指定は173行目からですのでそちらを修正して下さい #<<<地域テーブル ### 20061123 mizuho #@areatbl = ('北海道','青 森','岩 手','秋 田','宮 城','山 形','福 島', #'栃 木','群 馬','茨 城','埼 玉','東 京','千 葉','神奈川','山 梨','長 野', #'新 潟','富 山','石 川','福 井','静 岡','愛 知','岐 阜','三 重','滋 賀', #'京 都','大 阪','兵 庫','奈 良','和歌山','鳥 取','島 根','岡 山','広 島', #'山 口','徳 島','香 川','愛 媛','高 知','福 岡','佐 賀','長 崎','熊 本', #'大 分','宮 崎','鹿児島','沖 縄','その他','内緒♪'); @areatbl = ('その辺','あちこち','わかりません','内緒♪','ヒ・ミ・ツ','北海道','東北','関東','東京','甲信越','関西','中部','四国','九州','南西諸島','小笠原諸島','国外','地球外','その他'); ### #■■■ Ver0.91より追加↓ ■■■ #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ # Sendmailが使える方のみ以下の項目を設定して下さい。 # ※Sendmailとは? #   メールソフトを立ち上げないで、指定した相手にメールを送る事が出来る機能です。 #   自分のプロバイダーがSendmailに対応しているか、パスはどこ?等は、各自のプロバイダー #   のHPでご確認して下さいね。 #+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #投稿時に管理者にメール送信する場合、sendmailのパスを指定 $sendmail = "/usr/sbin/sendmail"; #メール送信先アドレス。(管理者のアドレス)…「@」の前には必ず「¥」を付けてね。 $smail_address = "sato.mizuho\@nifty.ne.jp"; $hiho = 0 ; #プロバイダーが「hi-ho」の人のみ「1」にして下さい。 ※Sendmail使う場合 #■■■ Ver0.92より追加↑ ■■■ $damedame = 0 ; #Locationヘッダが使えないサーバーは1。通常は0でいいはず。※トクトク、3nopage,WinNTサーバー等が1かな。 #◆◆◆↓セキュリティ◆◆◆ $postchk = 1; #投稿時・メンテナンス時のMethodをPOST限定にする場合は1。以外は0。 $urlchk = 'http://www.zensoku.info/cgi-bin/guestbook2/'; #ここで指定されたアドレス(CGIの設置アドレスを記入)以外から投稿があった場合をエラーとします。設定しない場合は'' $renchan = 0 ; #指定回数以上の連続投稿はエラーとする。設定しない場合は0としてね。 $urllink = 2 ; #タイトル及び本文にhttpからのリンクがあったらエラーにする? #(0:しない 1:URLは全てする 2:以下の$urlerrで指定された文字が含まれているURLのみエラーとする #↓$urllink=2の場合、以下に指定した文字を含むURLをエラーとする $urlerrnm[0] = 'exe'; $urlerrnm[1] = 'virus'; $kaigyo = 2; #指定値分の改行が連続した場合、1行改行に置換します。 ※指定しない場合は0 $name_comment = 'coxmment';#定期的に投稿してくるような事があったらこの名前を適当に変えてみて下さい。自動投稿スクリプトの種類によっては全然意味無いけど。 @errword = (',','url','URL','<','>'); #投稿禁止語句 ex.@errword = ('死ね','テストテスト'); $urlcnt = 0; #メッセージ欄に記入出来るURLの個数 ※指定しない場合は0 $japan = 1; #メッセージ欄に"全角文字/半角カナ(但し半角カナは文字化けする事もあります)"が1文字でも無ければエラーとする?(0:no 1:yes) $mailerr = 0; #メアド欄を入力されたらエラーにする?(0:no 1:yes) ※自動書込ツールはメアドを指定してくる事が多い為あえてエラーとしてみる $urlerr = 0; #URL欄を入力されたらエラーにする?(0:no 1:yes) ※自動書込ツールはURLを指定してくる事が多い為あえてエラーとしてみる #◆◆◆↑セキュリティ◆◆◆ $autolink = 0 ; #「http〜」を入力すると「こちら」と自動リンクするのを使う?(0:no 1:yes)  #スクロールバーの色変更。よくわからない方は、"EOM"の次の行から先頭がEOMの行の間を削除してね。 $scrollbar = <<"EOM"; BODY{ scrollbar-base-color : #eeeeee; } EOM $url_target = "_top"; #戻り先のURLを表示する際のターゲット #<<<-------------------------------- ここから下はいじらない方がいいです。--------------------------------------- @errtag = ('table','meta','form','!--','embed','html','body','tr','td','th','a'); #デンジャラ〜なタグ ############################################################################### #### Main Process START ##################################################### ############################################################################### $agentsoft = $ENV{'HTTP_USER_AGENT'}; $agentsoft =~ s/,/./g; $agentsoft =~ s/; Yahoo\! JAPAN Version Windows 95\/NT CD-ROM Edition 1.0.//g; $ENV{'TZ'} = "JST-9"; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); #システム日時・時刻取得 $year = sprintf("%02d",$year + 1900); $month = sprintf("%02d",$mon + 1); $mday = sprintf("%02d",$mday); $hour = sprintf("%02d",$hour); $min = sprintf("%02d",$min); if ( substr($month,0,1) == 0 ) { $month =~ s/0/ /; } if ( substr($mday,0,1) == 0 ) { $mday =~ s/0/ /; } $week = ('日','月','火','水','木','金','土') [$wday]; $today = "$month/$mday($week) $hour:$min"; &cookieget; #<<; close(INI); #各種設定値を取得 foreach $line (@lines) { $line =~ s/\"/\'/g; if ($line =~ /\$titlename = '(.*)'/) { $titlename = $1; } elsif ($line =~ /\$titlelogo = '(.*)'/) { $titlelogo = $1; } elsif ($line =~ /\$backpicture = '(.*)'/) { $backpicture = $1; } elsif ($line =~ /\$bgcolor = '(.*)'/) { $bgcolor = $1; } elsif ($line =~ /\$moto_bgcolor = '(.*)'/) { $moto_bgcolor = $1; } elsif ($line =~ /\$moto_txcolor = '(.*)'/) { $moto_txcolor = $1; } elsif ($line =~ /\$res_bgcolor = '(.*)'/) { $res_bgcolor = $1; } elsif ($line =~ /\$res_txcolor = '(.*)'/) { $res_txcolor = $1; } elsif ($line =~ /\$titlecolor = '(.*)'/) { $titlecolor = $1; } elsif ($line =~ /\$textcolor = '(.*)'/) { $textcolor = $1; } elsif ($line =~ /\$namecolor = '(.*)'/) { $namecolor = $1; } elsif ($line =~ /\$icon_szw = '(.*)'/) { $icon_szw = $1; } elsif ($line =~ /\$icon_szh = '(.*)'/) { $icon_szh = $1; } elsif ($line =~ /\$icon_use = '(.*)'/) { $icon_use = $1; } elsif ($line =~ /\$linkcolor = '(.*)'/) { $linkcolor = $1; } elsif ($line =~ /\$vlinkcolor = '(.*)'/) { $vlinkcolor = $1; } elsif ($line =~ /\$alinkcolor = '(.*)'/) { $alinkcolor = $1; } elsif ($line =~ /\$hovercolor = '(.*)'/) { $hovercolor = $1; } elsif ($line =~ /\$pt = '(.*)'/) { $pt = $1; } elsif ($line =~ /\$url = '(.*)'/) { $url = $1; #i010117 } else { if ($line =~ /icon_gif.*'(.*)'/) { if ( $sw1 == 0 ) { $sw1 = 1 ; $j = 0 ; } $icon_gif[$j] = $1; } if ($line =~ /iconnm.*'(.*)'/) { if ( $sw2 == 0 ) { $sw2 = 1 ; $j = 0 ; } $iconnm[$j] = $1; } if ($line =~ /icon_o_gif.*'(.*)'/) { if ( $sw3 == 0 ) { $sw3 = 1 ; $j = 0 ; } $icon_o_gif[$j] = $1; } if ($line =~ /icon_o_nm.*'(.*)'/) { if ( $sw4 == 0 ) { $sw4 = 1 ; $j = 0 ; } $icon_o_nm[$j] = $1; } $j++; } } #============================================================================================================================================================================================= #フォームCSS設定 ※使用しない場合は、$css_style = "";とし、そこから2行(先頭がEOMの行までを)を削除して下さい。 $css_style = <<"EOM"; STYLE=font-size:$pt;color:#333333;background-color:#ffffcc;border-style:solid;border-color:#666666;border-width:1; EOM if ( $FORM{'action'} eq "maintenance" ) { &Maintenance; } #<<<"処理"がメンテナンスの場合 if ( $FORM{'action'} eq "update" ) { &update ; } #<<<ログファイル更新(編集時) if ( $FORM{'action'} eq 'regist' ) { ®ist ; } #<<<ログ登録処理 if ( $FORM{'action'} eq 'res' ) { &res ; } #<<<レス書き込み処理 if ( $FORM{'action'} eq 'info' ) { &info ; } #<<<昇進資格を見る if ( $FORM{'action'} eq 'icondisp' ) { &icondisp ; } #<<<アイコン一覧を見る &header ; #<</g; $value =~ s/\r|\n/\/g; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ tr/+/ /; $value =~ s/\r\n/\/g; $value =~ s/\r|\n/\/g; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; if ($tag eq 'yes') { #危険なタグは禁止!!! foreach ( @errtag ) { if ($value =~ /<$_(.|\n)*>/i) { &error("使用出来ないタグが入力されています"); } } } foreach ( @errword ) { if ( $_ && $value =~ /$_/) { &error("投稿禁止単語が入力されていますので投稿出来ません"); } } if ( $urllink && ($name eq 'name' || $name eq 'title' || $name eq 'hp' || $name eq $name_comment )) { if ( $urllink == 1 ) { if ( $value =~ /tp:\/\//i && $name ne 'hp' ) { &error("セキュリティ対策の為、URLは入力出来ません。"); } } else { foreach $buf ( @urlerrnm ) { if ( $value =~ /([^=^\"]|^)(http|ftp)([\w|\!\#\&\=\-\%\@\~\;\+\:\.\?\/]+)/i ) { if ( $3 =~ /$buf/ ) { &error("文字「$buf」は、セキュリティ対策の為、入力出来ません。"); } } } } $value =~ s/(\r\n){$kaigyo,}/$1/g if ( $kaigyo ) ; } if ( $name ne $name_comment ) { $value =~ s/\r\n//g; $value =~ s/\r|\n//g; } if ( $tag ne 'yes' || $name ne $name_comment ) { $value =~ s/&/&/g; $value =~ s/"/"/g; $value =~ s//>/g; } $value =~ s/\,/,/g; &jcode'convert(*value,'sjis'); $FORM{$name} = $value; } if ( $FORM{'action'} eq 'regist' || $FORM{'action'} eq 'maintenance' || $FORM{'action'} eq 'update' || $FORM{'action'} eq 'res' ) { if ( $postchk && !$post ) { &error("不正な投稿です。"); } if ( $urlchk && $ENV{HTTP_REFERER} !~ /$urlchk/i ) { exit; } } $FORM{$name_comment} =~ s/\r\n/
/g; $FORM{$name_comment} =~ s/\r|\n/
/g; $FORM{'hp'} =~ s/^http\:\/\///; } ###<-------------------------------------------------------------- ###<--- 入力フォーム ###<-------------------------------------------------------------- sub forminput { print "
\n"; if ( $FORM{'action'} ne 'res' ) { if ( $titlelogo ) { print "
\n"; } else { print "$titlename
\n"; } } else { print "返信用フォームです
\n"; } print "|HOME |"; if ( $logfile2 ne '' ) { print " 昇進資格|\n"; } ### mizuho add print "Guest Book Part1 へ | \n";### end print "

\n"; if ( $buttonflag eq '1' ) { print "\n"; print "
\n"; print "
\n"; print "\n"; print "\n"; print "
\n"; } elsif ( $buttonflag eq '2' ) { print "\n"; print "
\n"; print "
\n"; $i = 0 ; foreach ( @BBSSELECT ) { ($title) = split(/,/,$_); print " "; $i++; } print "
\n"; } elsif ( $buttonflag eq '3' ) { print "\n"; $i = 0 ; print "\n"; foreach ( @BBSSELECT ) { print ""; print "\n"; $i++; } print "
\n"; print "\"$BBSSELECT[$i]\"$BBSSELECT[$i]
\n"; } print "
\n"; print "\n"; if ( $FORM{'action'} eq 'maintenance' ) { print "\n"; print "\n"; print "\n"; $FORM{'title'} = "" ; } else { print "\n"; $c_name = $COOKIE{'nm'} ; $c_email = $COOKIE{'em'} ; $c_hp = $COOKIE{'hp'} ; $c_icon = $COOKIE{'icon'} ; $c_area = $COOKIE{'area'} ; $c_title = "" ; $c_comment = "" ; $c_resno = "" ; $c_color = $COOKIE{'cl'} ; $c_color2 = $COOKIE{'cl2'} ; $c_pass = $COOKIE{'ps'} ; } print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } else { print " \n"; } print "\n"; } else { print " \n"; } if ( $icon_use eq 'yes' ) { print "\n"; print "\n"; print "\n"; } if ( $color_use eq 'yes' ) { print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } $c_comment =~ s/&/&/g; print "\n"; print ""; if ( $icon_use ne 'yes' ) { print "\n"; print "
\n"; print "Name\n"; print "\n"; print "Email"; print "
\n"; print "URL"; print "\n"; if ( $FORM{'action'} ne 'res' && $c_resno eq '' ) { print "Title"; if ( $FORM{'action'} ne 'res' && $c_resno eq '' ) { print "
発信地\n"; &areaset ; print "Icon"; print "\n"; print "  アイコン一覧\n"; print "
背景色\n"; if ( !($c_color) ) { $c_color = 0 ; } #i000329 foreach ( $i = 0 ; $i <= $#COLORS ; $i++) { if ( $c_color && $i == $c_color ) { $dmy = "checked"; } else { $dmy = ''; } #u000329 print "\n"; print "\n"; } print "
文字色\n"; if ( !($c_color2) ) { $c_color2 = 0 ; } #i000329 foreach ( $i = 0 ; $i <= $#COLORS2 ; $i++) { if ( $c_color2 && $i == $c_color2 ) { $dmy = "checked"; } else { $dmy = ''; } #u000329 print "\n"; print "\n"; } print "
メッセージ\n"; print "
発信地\n"; &areaset ; print "      "; } else { print "\n"; } if ( $FORM{'action'} ne 'res' ) { print "  \n"; } else { print "\n"; print "\n"; } print "\n"; if ( $FORM{'action'} ne 'maintenance' ) { print "  Password: (英数字4〜8文字)\n"; } else { print "\n"; } print "
\n"; print "
\n"; } ###<-------------------------------------------------------------- ###<--- HTMLヘッダー書き出し ###<-------------------------------------------------------------- sub header { print "Content-type: text/html; charset=Shift_JIS\n\n"; print "\n\n"; print "\n"; print "$titlename\n"; #<<>> print "\n"; #<<>> print "\n"; if ($backpicture) { $set = "background=\"$backpicture\""; if ( $bgcolor ) { $set .= " bgcolor=\"$bgcolor\"" ; } } elsif ($bgcolor ) { $set = "bgcolor=\"$bgcolor\""; } print "\n"; } ###<-------------------------------------------------------------- ###<--- HTMLフッダー書き出し ###<-------------------------------------------------------------- sub footer { #<<< ↓消さないでネ♪ print "\n"; print "\n"; } ###<-------------------------------------------------------------- ###<--- ログファイル読み込み ###<-------------------------------------------------------------- sub dataread { #<<<ログ読み込み if ( !(open(IN,"$logfile"))) { &error("ログファイル($logfile)のオープンに失敗しました"); } @LOG = ; close(IN); @RESLOG = () ; @MAINLOG = () ; $MAXNO = ''; foreach ( @LOG ) { ($no,$name,$email,$hp,$icon,$title,$comment,$regdate,$resno,$area,$agent,$ksu,$col,$col2,$ps,$hst) = split(/,/,$_); if ( $resno eq '' ) { push(@MAINLOG,"$_") ; } else { push(@RESLOG,"$_") ; } push(@SVLOG,"$_"); if ( $no >= $MAXNO ) { #最新の投稿b退避 $MAXNO = $no ; } } @RESLOG = reverse @RESLOG ; #レスログは古い順に。 } ###<-------------------------------------------------------------- ###<--- ログ表示 ###<-------------------------------------------------------------- sub view { &dataread ; #<<<ログ読み込み local($pagemax2,$dm,$p,$d,$col,$col2,$i,$z) ; print "

\n"; #表示対象ページの先頭データ件数を算出 $dm = @MAINLOG; if ( $FORM{'action'} ne 'res' ) { $p = $dm / $pagemax ; if ( $dm % $pagemax != 0) { $p++ ; } $p = sprintf("%3d",$p); if ( $FORM{'page'} eq "NEXT" ) { $d = ($FORM{'disppage'} + 1) * $pagemax - $pagemax ; $FORM{'disppage'} = $FORM{'disppage'} + 1 ; } elsif ( $FORM{'page'} eq "BACK" ) { $d = ($FORM{'disppage'} - 1) * $pagemax - $pagemax ; $FORM{'disppage'} = $FORM{'disppage'} - 1 ; } else { $d = 0 ; $FORM{'disppage'} = 1 ; } $pagemax2 = $pagemax ; } else { $pagemax2 = $dm ; $d = 0 ; } $z = 1 ; for ( $i = $d ; ( $z <= $pagemax2 ) && ( $i < $dm ); $i++ ) { ($no,$name,$email,$hp,$icon,$title,$comment,$regdate,$resno,$area,$agent,$ksu,$bcolor,$fcolor,$ps,$hst) = split(/,/,$MAINLOG[$i]); $hst =~ s/\n//g; if ( $color_use eq 'yes' ) { $col = $COLORS[$bcolor] ; $col2 = $COLORS2[$fcolor] ; } else { $col = $moto_bgcolor ; $col2 = $moto_txcolor ; } if ( $FORM{'action'} ne 'res' || ($FORM{'action'} eq 'res' && $FORM{'no'} eq $no) ) { if ( $FORM{'action'} ne 'res' ) { print "
"; print ""; print ""; print ""; } print "
\n"; print "
\n"; print "\n"; print "\n"; print ""; print "\n"; print ""; print "\n"; print "\n"; print "
\n"; print "
\n"; print ""; print ""; print "\n"; print "\n"; print "\n"; print "
\n"; print "◆ $title\n"; if ( length($title) > 30 ) { $dmy = 'size=-1' } else { $dmy = '' } print "   ++ $name\n"; if ( $logfile2 ne '' ) { $ranking = &rankget($ksu) ; print "  ($ranking)   \n"; } else { print "   \n"; } print ""; if ( $email ne '' ) { print "[Email]\n"; } if ( $hp ne '' ) { print "[URL]\n"; } print " ..( $areatbl[$area] )\n"; if ( $FORM{'action'} ne 'res' ) { print "\n"; } print "
"; print "
\n"; if ( $icon_use eq 'yes' ) { &icon_set($name) ; } else { print " "; } print "\n"; $comment =~ s/([^=^\"]|^)(http|ftp)([\w|\!\#\&\=\-\%\@\~\;\+\:\.\?\/]+)/$1こちら<\/a>/g if ( $autolink == 1 ) ; $comment =~ s/&/&/g; print "$comment\n"; print "
\n"; if ( $agentflag eq 'yes' ) { print "$agent "; } if ( $hostflag eq 'yes' ) { print "$hst "; } print "++ $regdate\[$no\]
\n"; print "
\n"; print "
\n"; print "
\n"; print "
\n"; print "
"; foreach $buf ( @RESLOG ) { ($no2,$name,$email,$hp,$icon,$title,$comment,$regdate,$resno,$area,$agent,$k,$bcolor,$fcolor,$ps,$hst) = split(/,/,$buf); $hst =~ s/\n//g; if ( $color_use eq 'yes' ) { $col = $COLORS[$bcolor] ; $col2 = $COLORS2[$fcolor] ; } else { $col = $res_bgcolor ; $col2 = $res_txcolor ; } if ( $no eq $resno ) { print "
"; print "\n"; print "\n"; print ""; print "\n"; print ""; print "\n"; print "\n"; print "
\n"; print "
\n"; print ""; print "\n"; print ""; print ""; print "\n"; print ""; print "\n"; print ""; print "
\n"; print "++ $name\n"; if ( $logfile2 ne '' ) { $ranking = &rankget($k) ; print "  ($ranking)   \n"; } else { print "   \n"; } print ""; if ( $email ne '' ) { print "[Email]\n"; } if ( $hp ne '' ) { print "[URL]\n"; } print " ..( $areatbl[$area] )\n"; print "
"; print "
"; if ( $icon_use eq 'yes' ) { &icon_set($name) ; } else { print " "; } print ""; $comment =~ s/([^=^\"]|^)(http|ftp)([\w|\!\#\&\=\-\%\@\~\;\+\:\.\?\/]+)/$1こちら<\/a>/g if ( $autolink == 1 ) ; $comment =~ s/&/&/g; print "$comment\n"; print "
\n"; if ( $agentflag eq 'yes' ) { print "$agent "; } if ( $hostflag eq 'yes' ) { print "$hst "; } print "++ $regdate\[$no2\]
\n"; print "
\n"; print "
\n"; print "
\n"; print "
\n"; } } if ( $FORM{'action'} ne 'res' ) { print "\n"; } print "
\n"; } $z++; } print "
\n"; if ( $FORM{'action'} ne 'res' ) { print "
\n"; print "
\n"; print "\n"; print "\n"; if ( $FORM{'disppage'} != 1) { print "\n"; } if ( $FORM{'disppage'} + 1 <= $p ) { print "\n"; } print "
\n"; print "


\n"; print "
\n"; print "
\n"; print "No.\n"; print "Pass\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; } } ###<-------------------------------------------------------------- ###<--- ログ出力 ###<-------------------------------------------------------------- sub regist { # ホスト名を取得 $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if ($host eq "" || $host eq "$addr") { ($p1,$p2,$p3,$p4) = split(/\./,$addr); $temp = pack("C4",$p1,$p2,$p3,$p4); $host = gethostbyaddr("$temp", 2); if ($host eq "") { $host = $addr; } } #掲示板荒らし対策 foreach $buf(@DANGER_LIST){ if ( $buf ) { # パターンマッチを変換 $buf=~ s/\./\\./g; $buf=~ s/\?/\./g; $buf=~ s/\*/\.\*/g; if($host =~ /$buf/gi){ &error("\申\し\訳ありません。
あなたのプロバイダーからは投稿できませんでした. "); } } } if ( $maxword ne '' && (length($FORM{$name_comment}) > $maxword)) { &error("メッセージは$maxword文字までしか登録出来ません。"); } if ( $FORM{'name'} eq '') { &error("お名前を入力して下さい。"); } if ( $FORM{$name_comment} eq '') { &error("メッセージは省略出来ません。"); } if ( $FORM{'title'} eq '') { $FORM{'title'} = '(無題)';} # URLと同じものが本文にあったら宣伝 if ($FORM{'hp'}){ if ( $FORM{$name_comment} =~ /$FORM{'hp'}/) { &error("宣伝投稿と見なされますので投稿出来ません"); } } if ( $urlcnt ) { $urlnum = ($FORM{$name_comment} =~ s/(h?ttp)/$1/ig); if ( $urlnum > $urlcnt ) { &error("URLは" . ($urlcnt + 1) . "個以上は記入出来ません"); } } if ( $japan ) { $str = $FORM{$name_comment}; jcode::convert(\$str, 'euc','sjis'); if($str =~ /[\xA1-\xFE][\xA1-\xFE]/ || $str =~ /\x8E/ || $str =~ /[\x8E\xA1-\xFE]/){ } else { &error("半角英数字のみの投稿は出来ません。"); } } if ( $mailerr == 1 && $FORM{'email'} ) { &error("セキュリティ対策の為、メールアドレスは入力出来ません。"); } if ( $urlerr == 1 && $FORM{'hp'} ) { &error("セキュリティ対策の為、URLは入力出来ません。"); } &filelock ; #ファイルロック &dataread ; #<<<ログ読み込み foreach ( @SVLOG ) { ($oyano,$name,$email,$hp,$icon,$title,$comment,$regdate,$resno,$area,$agent,$ksu,$col,$col2,$ps,$hst) = split(/,/,$_); $hst =~ s/\n//; if ( $hst ne $host ) { $chk=1; } if ( $renchan != 0 && $hst eq $host && $chk != 1 ) { $write_cnt++ ; if ( $write_cnt + 1 >= $renchan ) { &fileunlock ; &error("$renchan回以上の連続投稿は禁止しています"); } } if ( $name eq $FORM{'name'} && $comment eq $FORM{$name_comment} ) { &fileunlock ; &error("二重投稿は禁止しています。") ; last ; } } if ( $logfile2 ne '' ) { if ( !(open(IN2,"$logfile2"))) { &fileunlock ; &error("ログファイル2($logfile2)のオープンに失敗しました"); } $flg = 0 ; while ( ) { ($n,$k) = split(/,/,$_); $k =~ s/\n//g; if ( $FORM{'name'} eq $n ) { $k++; $dcnt = $k ; $flg = 9; } push(@sv,"$n,$k\n"); } if ( $flg == 0 ) { push(@sv,"$FORM{'name'},1\n"); $dcnt = 1; } close(IN2); if ( !(open(OUT2,">$logfile2"))) { &fileunlock ; &error("ログファイル($logfile2)のオープンに失敗しました"); } print OUT2 @sv; close(OUT2); } $dcnt2 = @SVLOG; if ($dcnt2 >= $datamax) { pop(@SVLOG); } if ( $dcnt2 < 1 ) { $no = 1; #1件目 } else { $no = $MAXNO + 1; } #レス記事登録時で、ログを先頭に移動する場合の処理 if ( $resflag eq 'yes' && $FORM{'resno'} ne '') { $cnt = 0 ; foreach $buf ( @SVLOG ) { ($oyano,$name,$email,$hp,$icon,$title,$comment,$regdate,$resno,$area,$agent,$ksu,$col,$col2,$ps,$hst) = split(/,/,$buf); if ( $oyano eq $FORM{'resno'} ) { splice(@SVLOG,$cnt,1); $wk = "$oyano,$name,$email,$hp,$icon,$title,$comment,$regdate,$resno,$area,$agent,$ksu,$col,$col2,$ps,$hst"; unshift(@SVLOG,$wk); $svtitle = $title ; $svno = $oyano ; last ; } $cnt++ ; } } #管理者の投稿の場合、管理者用アイコンに置き換える for ( $i = 0 ; $i <= $#icon_o_nm ; $i++ ) { if ( $FORM{'name'} eq $icon_o_nm[$i] ) { $FORM{'icon'} = $i ; last ; } } # パスワードの暗号化(crypt関数使用)) if ($FORM{'pass'} ne "") { &pass_enc($FORM{'pass'}); } else { $pass = '' ; } unshift(@SVLOG,"$no,$FORM{'name'},$FORM{'email'},$FORM{'hp'},$FORM{'icon'},$FORM{'title'},$FORM{$name_comment},$today,$FORM{'resno'},$FORM{'area'},$agentsoft,$dcnt,$FORM{'color'},$FORM{'color2'},$pass,$host\n"); if ( !(open(OUT,">$logfile"))) { &fileunlock ; &error("ログファイル($logfile)のオープンに失敗しました"); } print OUT @SVLOG; close(OUT); &fileunlock ; #ファイルロック解除 #COOKIE設定 &cookieset ; if ( $sendmail ) { &SMail ; } if ( $damedame == 0 ) { print "Location: $script?bbschoice=$FORM{'bbschoice'}\n\n"; } else { print "Content-type: text/html\n\n"; print "\n\n"; } exit ; } ###<-------------------------------------------------------------- ###<--- メンテナンスモード ###<-------------------------------------------------------------- sub Maintenance { if ( $FORM{'pass'} eq "") { &error("パスワードを入力して下さい。"); } $found = 0 ; &dataread ; #<<<ログ読み込み foreach ( @SVLOG ) { ($no,$name,$email,$hp,$icon,$title,$comment,$regdate,$resno,$area,$agent,$ksu,$col,$col2,$ps,$hst) = split(/,/,$_); if ( $FORM{'no'} eq $no ) { if ($FORM{'pass'} ne $password && (&pass_dec($ps))) { &error("パスワードが違います。"); } $found = 1 ; if ( $FORM{'proc'} eq "delete" ) { &update ; exit; } &header ; $found2 = 0 ; for ( $k = 0 ; $k <= $#icon_o_nm ; $k++ ) { if ( $name eq $icon_o_nm[$k] ) { $found2 = 1 ; last ; } } if ( $found2 == 0 ) { $c_icon = $icon ; } else { $c_icon = 0 ;} $c_name = $name ; $c_email = $email ; $c_hp = $hp ; $c_icon = $icon ; $c_title = $title ; $c_comment = $comment ; $c_area = $area ; $c_resno = $resno ; $c_color = $col ; $c_color2 = $col2 ; $c_pass = $FORM{'pass'} ; $c_comment =~ s/\/\n/g; &forminput ; last; } } if ( $found == 0 ) { &error("該当する記事Noのデータは存在していません。"); } &footer ; exit; } ###<-------------------------------------------------------------- ###<--- ログファイル更新 ###<-------------------------------------------------------------- sub update { &filelock ; #ファイルロック &dataread ; #<<<ログ読み込み if ( $FORM{'proc'} eq 'delete' ) { foreach (@LOG) { ($no,$name,$email,$hp,$icon,$title,$comment,$regdate,$rno,$area,$agent,$ksu,$col,$col2,$ps,$hst) = split(/,/,$_); if ( $FORM{'no'} eq $no) { #<<<メンテ対象者の場合 if (($FORM{'no'} eq $no) && $FORM{'pass'} ne $password && (&pass_dec($ps))) { &fileunlock ; #ファイルロック解除 &error("パスワードが違います。"); } $delname = $name ; last ; } } #訪問回数を1減算 if ( $logfile2 ne '' ) { if ( !(open(IN2,"$logfile2"))) { &fileunlock ; &error("ログファイル2($logfile2)のオープンに失敗しました"); } $flg = 0 ; while ( ) { ($n,$k) = split(/,/,$_); $k =~ s/\n//g; if ( $delname eq $n ) { $k--; } push(@sv,"$n,$k\n"); } close(IN2); if ( !(open(OUT2,">$logfile2"))) { &fileunlock ; &error("ログファイル($logfile2)のオープンに失敗しました"); } print OUT2 @sv; close(OUT2); } } @new = (); $j = 0 ; $delsw = 0 ; @LOG = reverse @LOG ; foreach (@LOG) { ($no,$name,$email,$hp,$icon,$title,$comment,$regdate,$rno,$area,$agent,$ksu,$col,$col2,$ps,$hst) = split(/,/,$_); if ( $FORM{'no'} eq $no) { #<<<メンテ対象者の場合 if ($FORM{'pass'} ne $password && (&pass_dec($ps))) { &fileunlock ; #ファイルロック解除 &error("パスワードが違います。"); } $delsw = 1 ; $svname = $name ; if ( $FORM{'proc'} eq "edit" ) { $FORM{$name_comment} =~ s/\n//g; #管理者の投稿の場合、管理者用アイコンに置き換える for ( $i = 0 ; $i <= $#icon_o_nm ; $i++ ) { if ( $FORM{'name'} eq $icon_o_nm[$i] ) { $FORM{'icon'} = $i ; last ; } } if ( $rno eq '' ) { push(@new,"$no,$FORM{'name'},$FORM{'email'},$FORM{'hp'},$FORM{'icon'},$FORM{'title'},$FORM{$name_comment},$regdate,$rno,$FORM{'area'},$agent,$ksu,$FORM{'color'},$FORM{'color2'},$ps,$hst"); } else { push(@new,"$no,$FORM{'name'},$FORM{'email'},$FORM{'hp'},$FORM{'icon'},$title,$FORM{$name_comment},$regdate,$rno,$FORM{'area'},$agent,$ksu,$FORM{'color'},$FORM{'color2'},$ps,$hst"); } } } else { if ( $FORM{'proc'} eq 'delete' && $FORM{'no'} eq $rno ) { if ( $delname eq $name ) { $j++; } } else { if ( $FORM{'proc'} eq 'delete' ) { if ( $delname eq $name ) { $j++; } } } if ( $FORM{'proc'} eq 'delete' && $name eq $delname) { push(@new,"$no,$name,$email,$hp,$icon,$title,$comment,$regdate,$rno,$area,$agent,$j,$col,$col2,$ps,$hst"); } else { push(@new,"$_"); } } } @new = reverse @new ; if ( !(open(OUT,">$logfile"))) { &fileunlock ; &error("ログファイル($logfile)のオープンに失敗しました"); } print OUT @new; close(OUT); &fileunlock ; #ファイルロック解除 if ( $damedame == 0 ) { print "Location: $script?bbschoice=$FORM{'bbschoice'}\n\n"; } else { print "Content-type: text/html\n\n"; print "\n\n"; } exit; } ###<-------------------------------------------------------------- ###<--- レス書き込み処理 ###<-------------------------------------------------------------- sub res { &header ; &forminput ; print "
\n"; &view ; print "
\n"; print "
\n"; print "戻る


\n"; &footer ; exit; } ###<------------------------------------------------------------- ###<--- ランキング取得 ###<-------------------------------------------------------------- sub rankget { $set = 0 ; $tmax = $#rankno ; for ( $j = 0 ; $j <= $tmax ; $j++ ) { if ( $_[0] >= $rankno[$j] ) { $ranking = $rank[$j] ; } } return ($ranking); } ###<------------------------------------------------------------- ###<--- クッキー取得 ###<-------------------------------------------------------------- sub cookieget { $cookies = $ENV{'HTTP_COOKIE'}; @pairs = split(/;/,$cookies); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ s/ //g; $DUMMY{$name} = $value; } @pairs = split(/,/,$DUMMY{'maruchan'}); foreach $pair (@pairs) { ($name, $value) = split(/\!/, $pair); $COOKIE{$name} = $value; } } ###<------------------------------------------------------------- ###<--- クッキー設定 ###<-------------------------------------------------------------- sub cookieset { ($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) =gmtime(time + 30*24*60*60); $yearg += 1900 ; if ($secg < 10) { $secg = "0$secg"; } if ($ming < 10) { $ming = "0$ming"; } if ($hourg < 10) { $hourg = "0$hourg"; } if ($mdayg < 10) { $mdayg = "0$mdayg"; } $mong = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mong]; $youbi = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[$wdayg]; $date_gmt = "$youbi, $mdayg\-$mong\-$yearg $hourg:$ming:$secg GMT"; $cook="nm\!$FORM{'name'},em\!$FORM{'email'},hp\!$FORM{'hp'},icon\!$FORM{'icon'},area\!$FORM{'area'},cl\!$FORM{'color'},cl2\!$FORM{'color2'},ps\!$FORM{'pass'}"; print "Set-Cookie: maruchan=$cook; expires=$date_gmt\n"; } ###<-------------------------------------------------------------- ###<--- エラー処理 ###<-------------------------------------------------------------- sub error { &header ; print "

$_[0]\n"; &footer; exit; } ###<-------------------------------------------------------------- ###<--- 地域情報設定 ###<-------------------------------------------------------------- sub areaset { print " \n"; } ###<-------------------------------------------------------------- ###<--- Information(昇進資格) ###<-------------------------------------------------------------- sub info { &header ; #<<<<< \昇\進資格 >>>

\n"; print "以下の投稿回数に従って、あなたは\昇\進していきます!!

\n"; $i = 0; print "\n"; $k = $#rank ; for ( @rank ) { print "\n"; print "\n"; $i++; } print "
$rank[$i]"; $j = $rankno[$i+1] - 1 ; if ( $i != $k ) { print "$rankno[$i] 〜$j 回\n"; } else { print "$rankno[$i] 以上\n"; } print "
"; print "戻る


\n"; &footer ; #<<

■■■ アイコン一覧 ■■■

\n"; print "\n"; $i = 0 ; $j = 0 ; while ( 1 ) { print "\n"; for ( $ln = 1 ; $j <= $#icon_gif && $ln <= $icon_line ; ) { print "\n"; print "\n"; $j++ ; $ln++ ; } if ( $j > $#icon_gif ) { if ( $ln < $icon_line ) { for ( ; $ln <= $icon_line ; ) { print "\n"; print "\n"; $ln++ ; } } print "\n"; last ; } print "\n"; $i++; } print "
$iconnm[$j]  
"; &footer ; #<<"; last ; } } if ( $found == 0 ) { print ""; } } ###<-------------------------------------------------------------- ###<--- ファイルロック設定 ###<-------------------------------------------------------------- sub filelock { foreach (1 .. 5) { if (-e $lockfile) { sleep(1); } else { open(LOCK,">$lockfile"); close(LOCK); return; } } &error("只今他の方が書き込み中です。ブラウザの「戻る」で戻って再度登録を行って下さい。"); } ###<-------------------------------------------------------------- ###<--- ファイルロック解除 ###<-------------------------------------------------------------- sub fileunlock { if (-e $lockfile) { unlink($lockfile); } } ###<------------------------------------------------------------- ###<--- パスワード暗号化 ###<-------------------------------------------------------------- sub pass_enc { if ( $ango == 1 ) { $pass = crypt($_[0], $_[0]); } else { $pass = $_[0]; } } ###<------------------------------------------------------------- ###<--- パスワードチェック ###<-------------------------------------------------------------- sub pass_dec { if ( $ango == 1 ) { if ($_[0] ne '' && ( crypt($FORM{'pass'}, $_[0]) eq $_[0]) ) { return 0 ; } } else { if ($FORM{'pass'} eq $_[0]) { return 0 ; } } return 1; } ###<-------------------------------------------------------------- ###<--- SendMail ###<-------------------------------------------------------------- sub SMail { $mailbuf = ""; $cv_ttl = $titlename; if ( $hiho == 1 ) { &jcode'convert(*cv_ttl,'euc'); open(MAIL,"| $sendmail -s \"$cv_ttl\" -f $FORM{'email'} $smail_address ") || &error("Sendmail Error!!"); } else { &jcode'convert(*ttl,'jis'); open(MAIL,"| $sendmail -t") || &error("Sendmail Error!!"); $mailbuf = "To: $smail_address\n"; # $mailbuf .= "From: $FORM{'email'}\n"; $mailbuf .= "From: GuestBook2\@zensoku.info\n"; $mailbuf .= "Subject: $cv_ttl\n"; $mailbuf .= "Content-Transfer-Encoding: 7bit\n"; $mailbuf .= "Content-type: text/plain\n"; $mailbuf .= "\n\n"; } # $mailbuf .= "============================================================\n"; # $mailbuf .= "■---『$titlename』に投稿がありました---■\n\n"; # $mailbuf .= "■『$titlename』に投稿あり■\n"; # $mailbuf .= "投稿日時:$today\n"; # $mailbuf .= "============================================================\n\n"; # $mailbuf .= "▼お名前\n"; # $mailbuf .= "$FORM{'name'}\n\n"; $mailbuf .= "▼お名前:$FORM{'name'}\n"; $mailbuf .= "▼日時:$today\n"; # if ( $FORM{'email'} ne '' ) { # $mailbuf .= "▼メールアドレス \n"; # $mailbuf .= "$FORM{'email'}\n\n"; # } # if ( $FORM{'hp'} ne '' ) { # $mailbuf .= "▼HPアドレス \n"; # $mailbuf .= "http://$FORM{'hp'}\n\n"; # } # $mailbuf .= "▼発信地\n"; # $mailbuf .= "$areatbl[$FORM{'area'}]\n\n"; if ( $FORM{'resno'} eq '' && $FORM{'title'} ) { $wk = $FORM{'title'} ; } else { $wk = "$svtitle(親記事No:$svno)に対してのレス記事です。" ; } if ( $wk ) { # $mailbuf .= "▼タイトル\n"; # $mailbuf .= "$wk\n\n"; $mailbuf .= "▼タイトル:$wk\n"; } # if ( $FORM{'pass'} ) { # $mailbuf .= "▼パスワード \n"; # $mailbuf .= "$FORM{'pass'}\n\n"; # } $mailbuf .= "▼ホスト名:$host\n"; $mailbuf .= "▼コメント\n"; $mailbuf .= "$FORM{$name_comment}\n"; # $mailbuf .= "$FORM{$name_comment}\n\n"; # $mailbuf .= "============================================================\n"; #漢字コードJIS変換&改行コードLF変換。 $mailbuf =~ s/\r\n/\n/g; $mailbuf =~ s/\r/\n/g; $mailbuf =~ s/
/\n/g; $mailbuf =~ s/&/&/g; $mailbuf =~ s/"/"/g; $mailbuf =~ s/<//g; &jcode'convert(*mailbuf,'jis'); print MAIL $mailbuf ; close(MAIL); }