#!/usr/bin/perl #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #+++  [ 書き込み隊2 Ver0.58 ] 2001.04.12 #+++ #+++ ・・・・・>>> All Created by Tacky #+++ #+++ ・・・・・>>> Copyright (c) 1999.9 Tacky's Room. All rights reserved.... #+++ #+++ Email >>> tacky2@ops.dti.ne.jp #+++ Homepage >>> http://tackysroom.com/ #+++ #+++ >>> Update-History... #+++ #+++ 2001.04.12(Ver0.58) >> 二重投稿チェック機能追加 #+++ >> ボタンとかにCSS追加 #+++ >> Locationヘッダが使えないサーバー対応 $damedameって所で指定するのだよ〜 #+++ 2000.07.12(Ver0.57) >> ファイルロックが解除されない場合がある不具合修正 #+++ 2000.06.15 >> Apache+Netscape文字化け対応・フォントサイズ指定可能にしました・CSS追加 #+++ [name]に半角スペースを入れると半角スペース以降認識しないバグ修正 #+++ 管理人&投稿者共に修正・削除処理を可能にしました(旧バージョンとログ互換していません)・リモホを保存していなかったバグ修正 #+++ 2000.06.20 >> メモ帳として利用した際、登録が動作しなかった・・・ #+++ 2000.06.23 >> URLが未入力でも、URLリンクしていました・・・ #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ require './jcode.pl'; #日本語コード変換 $url = "http://www.antiqueeducation.com/index.htm"; #戻り先URL $script = "http://www.antiqueeducation.com/cgi-bin9/kakikomitai2.cgi"; #このCGIの名前を指定 $logfile = './kakikomitai2.txt'; #ログファイルの名前を指定 $lockfile = './kakikomitai2.lock'; #ロックファイルの名前を指定 $titlename = 'Antique Education LINK'; #タイトルを指定 $titlelogo = 'http://www.antiqueeducation.com/cgi-bin9/linkrogo2.gif'; #タイトル画像を指定 $backpicture = 'http://www.antiqueeducation.com/kabe1.gif'; #背景画像を指定(使用しない場合は、''で良い) $bgcolor = ''; #背景色を指定 $textcolor = "#666666"; # 文字色 $linkcolor = "#cc6600"; # リンク色(未読リンク) $vlinkcolor = "#666666"; # リンク色(既読リンク) $alinkcolor = "#ff3300"; # リンク色(押した時) $pt = '10pt'; #全体のフォントサイズ(pt指定以外何があるのか、僕知らない。(^^ゞ) #「掲示板」として使う?管理者専用の「メモ帳」として使う? $proc = 1; #0:掲示板 1:メモ帳 $titleset = 1; #入力フォームに「タイトル」必要?(0:不要 1:必要) $datamax = 100 ; #最大データ保存件数 $pagemax = 10 ; #1ページ内に表示する件数 $password = '301063'; #メンテナンス用パスワード(管理者用) $tag = 'yes'; #タグ許可(yes,no) $method = 'POST'; #METHODの指定(POST又はGET) #<<<↓の画像はそのまま使用してね。パスだけ修正。 $gif_spacer = 'http://www.antiqueeducation.com/chietake/spacer.gif'; #ダミー透過画像 #-------------------------------------------------------------------------------- #--- 以下のどの色を使いますか? #--- 0:レッド 1:グリーン 2:オレンジ 3:パープル 4:ブルー 5:グレー 6:ブラウン #--- ※99を指定すると上記の色が順番に表示されます) #-------------------------------------------------------------------------------- #使用色 $color =99 ; #<<< ここから下はいじらなくても構いません。 #薄い色(テーブルほぼ全体の色となります) @tbl_color1 = ('#ff6666','#66cc00','#ffcc00','#cc99ff','#99ccff','#cecece','#f9e899') ; #濃い色(テーブル内の部分になります) @tbl_color2 = ('#cc0033','#006600','#cc3300','#660099','#0099cc','#9c9c9c','#cccc00') ; #メッセージ欄の背景色 @tbl_color3 = ('#ffffff','#ffffff','#ffffff','#ffffff','#ffffff','#ffffff','#ffffff') ; #メッセージ欄の「タイトル」文字色 @tbl_color4 = ('#000000','#000000','#000000','#000000','#000000','#000000','#003366') ; #メッセージ欄の「名前・投稿日時」文字色 @tbl_color5 = ('#000000','#000000','#000000','#000000','#000000','#000000','#000000') ; #メッセージ欄の「メッセージ欄」文字色 @tbl_color6 = ('#000000','#000000','#000000','#000000','#000000','#000000','#666666') ; @errtag = ('table','meta','form','!--','embed','html','body','tr','td','th','a'); #デンジャラ〜なタグ #掲示板荒らし対策。排除したいプロバのアドレスを設定して下さい。 # "xxx?.com"とした場合、"xxx1.com","xxx2.com"等、「?」の部分が文字列1つと判断します # "xxx*.com"とした場合、"xxx1.com","xxx12345.com等、「*」の部分が0個以上の文字列と判断します。 @DANGER_LIST=("xxx.com","yyy.com","zzz*.or.jp"); #掲示板荒らし対策その2。メッセージ最大文字数を指定。特に設定しない場合は、''として下さい。 $maxword = '' ; $col1 = 40 ; #掲示板で使用する場合のメッセージ欄の桁数 $col2 = 100 ; #メモ帳で使用する場合のメッセージ欄の桁数 $row1 = 4 ; #掲示板で使用する場合のメッセージ欄の行数 $row2 = 13 ; #メモ帳で使用する場合のメッセージ欄の行数 #投稿時のパスワードをcrypt関数を使用する(暗号化) #crypt関数が利用出来ない場合もありますので、投稿時にエラーになる場合は、「0:使用しない」にして下さいね。 $ango = 0 ; #0:使用しない 1:使用する (推奨:1:使用する) #============================================================================================================================================================================================= #フォームCSS設定 ("EOM"〜EOMの間にメッセージを書いてください) #※使用しない場合は、$css_style = "";とし、そこから2行(先頭がEOMの行までを)を削除して下さい。 $css_style = <<"EOM"; STYLE="font-size:$pt;color:#333333;border:1 dotted #999999;" onFocus="this.style.backgroundColor='#ffffcc'" onBlur="this.style.backgroundColor='#FFFFFF'" onMouseOver="this.focus()"アンティークエデュケーション講師陣のエッセイ EOM ############################################################################### #### Main Process START ##################################################### ############################################################################### $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); $week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday]; $today = "$month/$mday($week) $hour:$min"; if ($ENV{'HTTP_USER_AGENT'} !~ /MSIE/i) { $css_style = "" ; } &cookieget; #<</i) { &error("使用出来ないタグが入力されています"); } } } else { $value =~ s//>/g; } $value =~ s/\,/,/g; &jcode'convert(*value,'sjis'); $FORM{$name} = $value; } $FORM{'comment'} =~ s/\r\n/
/g; $FORM{'comment'} =~ s/\r|\n/
/g; $FORM{'hp'} =~ s/^http\:\/\///; } ###<-------------------------------------------------------------- ###<--- 入力フォーム ###<-------------------------------------------------------------- sub forminput { print "
\n"; print "
\n"; if ( ($FORM{'action'} ne 'maintenance' && $FORM{'action'} ne 'maintenance2') || $FORM{'proc'} eq 'write' ) { #u000620 $c_name = $COOKIE{'nm'} ; $c_email = $COOKIE{'em'} ; $c_hp = $COOKIE{'hp'} ; $c_pass = $COOKIE{'ps'} ; print "\n"; } else { print "\n"; print "\n"; print "\n"; } print "\n"; #掲示板として使う場合 if ( $proc != 1 ) { print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } if ( $titleset == 1 ) { print "\n"; print "\n"; } print "\n"; #掲示板として使う場合 if ( $proc != 1 ) { $col = $col1 ; $row = $row1 ; } else { $col = $col2 ; $row = $row2 ; } print "\n"; print "\n"; print "\n"; print "\n"; print "
Name
Email
URL
Title
Message
Password  (英数字4〜8文字)
   \n"; 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"; print "HOME\n"; print "
\n"; if ( $titlelogo ) { print "
\n"; } else { print "$titlename
\n"; } print "
\n"; } ###<-------------------------------------------------------------- ###<--- HTMLフッダー書き出し ###<-------------------------------------------------------------- sub footer { #<<< ↓消さないでネ♪ print "
\n"; print "kakikomitai2 Ver0.58 Created by Tacky\n"; print "
\n"; print "\n"; } ###<-------------------------------------------------------------- ###<--- ログファイル読み込み ###<-------------------------------------------------------------- sub dataread { #<<<ログ読み込み if ( !(open(IN,"$logfile"))) { &error("ログファイル($logfile)のオープンに失敗しました"); } @LOG = ; close(IN); } ###<-------------------------------------------------------------- ###<--- ログ表示 ###<-------------------------------------------------------------- sub view { &dataread ; #<<<ログ読み込み print "


\n"; #表示対象ページの先頭データ件数を算出 $dm = @LOG; if ( $dm % $pagemax == 0) { $p = $dm / $pagemax ; } else { $p = $dm / $pagemax + 1; } $p = sprintf("%3d",$p); if ( $FORM{'page'} eq "NEXT" ) { if ( $FORM{'disppage'} == 0 ) { $FORM{'disppage'} = 1 } ; $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 ; } $z = 1 ; $svcolor = 0 ; for ( $i = $d ; ( $z <= $pagemax ) && ( $i < $dm ); $i++ ) { ($no,$name,$email,$hp,$title,$comment,$regdate,$ps,$hst) = split(/,/,$LOG[$i]); if ( $color != 99 ) { $color1 = $tbl_color1[$color] ; $color2 = $tbl_color2[$color] ; $color3 = $tbl_color3[$color] ; $color4 = $tbl_color4[$color] ; $color5 = $tbl_color5[$color] ; $color6 = $tbl_color6[$color] ; } else { $color1 = $tbl_color1[$svcolor] ; $color2 = $tbl_color2[$svcolor] ; $color3 = $tbl_color3[$svcolor] ; $color4 = $tbl_color4[$svcolor] ; $color5 = $tbl_color5[$svcolor] ; $color6 = $tbl_color6[$svcolor] ; if ( $svcolor == $#tbl_color1 ) { $svcolor = 0 ;} else { $svcolor++ ; } } print "

\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
\n"; if ( $titleset == 1 ) { if ( !($title) ) { $title = "(無題)"; } print " ■$title
\n"; } #掲示板として使う場合 if ( $proc != 1 ) { print ""; print " ++ $name"; print "  \n"; if ( $email ne '' ) { print "[Email]\n"; } print " [URL]\n" if ( $hp ) ; if ( length($name) > 10 ) { print "
\n"; } $no = sprintf("%d",$no); print " ..$regdate\[$no\]"; } print "
\n"; print "\n"; print "\n"; print "
\n"; $comment =~ s/([^=^\"]|^)(http|ftp)([\w|\!\#\&\=\-\%\@\~\;\+\:\.\?\/]+)/$1こちら<\/a>/g; print "$comment\n"; if ( $proc == 1 ) { print "
No.[$no]
\n"; } print "
\n"; $z++; } $dm = @LOG; if ( $dm % $pagemax == 0) { $p = $dm / $pagemax ; } else { $p = $dm / $pagemax + 1; } $p = sprintf("%3d",$p); print "
\n"; print "\n"; if ( $FORM{'disppage'} != 0 && $FORM{'disppage'} !=1) { print "\n"; } if ( $FORM{'disppage'} + 1 <= $p ) { print "\n"; } print "


\n"; print "
\n"; print "
"; print "
\n"; print "No.\n"; print "Pass\n"; print "\n"; if ( $proc == 1 ) { print "\n"; print "\n"; print "\n"; } else { 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{'comment'}) > $maxword)) { &error("メッセージは$maxword文字までしか登録出来ません。"); } if ( $proc == 0 && $FORM{'name'} eq '') { &error("お名前を入力して下さい。"); } if ( $FORM{'comment'} eq '') { &error("メッセージは省略出来ません。"); } &filelock ; #ファイルロック &dataread ; #<<<ログ読み込み foreach ( @LOG ) { ($no,$name,$email,$hp,$title,$comment,$regdate,$ps,$hst) = split(/,/,$_); if ( $name eq $FORM{'name'} && $comment eq $FORM{'comment'} ) { &fileunlock ; &error("二重投稿は禁止しています。") ; last ; } } $dcnt = @LOG; if ($dcnt >= $datamax) { pop(@LOG); } if ( $dcnt < 1 ) { $no = 1; #1件目 } else { ($no,$dummy) = split(/,/,$LOG[0]); #最新記事No取得 $no++; } # パスワードの暗号化(crypt関数使用)) if ($FORM{'pass'} ne "") { &pass_enc($FORM{'pass'}); } else { $pass = '' ; } unshift(@LOG,"$no,$FORM{'name'},$FORM{'email'},$FORM{'hp'},$FORM{'title'},$FORM{'comment'},$today,$pass,$host\n"); if ( !(open(OUT,">$logfile"))) { &fileunlock ; &error("ログファイル($logfile)のオープンに失敗しました"); } print OUT @LOG; close(OUT); &fileunlock ; #ファイルロック解除 #COOKIE設定 &cookieset ; if ( $damedame == 0 ) { print "Location: $script?\n\n"; } else { print "Content-type: text/html\n\n"; print "\n\n"; } exit; } ###<-------------------------------------------------------------- ###<--- メンテナンスモード ###<-------------------------------------------------------------- sub Maintenance { if ( $FORM{'pass'} eq "") { &error("パスワードを入力して下さい。"); } &dataread ; #<<<ログ読み込み $found = 0 ; foreach ( @LOG ) { ($no,$name,$email,$hp,$title,$comment,$regdate,$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 ; $c_name = $name ; $c_email = $email ; $c_hp = $hp ; $c_title = $title ; $c_comment = $comment ; $c_pass = $FORM{'pass'} ; $c_comment =~ s/
/\n/g; &forminput ; &footer; exit ; } } &error("該当する記事Noのデータは存在していません。"); exit; } ###<-------------------------------------------------------------- ###<--- ログファイル更新 ###<-------------------------------------------------------------- sub update { &filelock ; #ファイルロック &dataread ; #<<<ログ読み込み foreach (@LOG) { ($no,$name,$email,$hp,$title,$comment,$regdate,$ps,$hst) = split(/,/,$_); if ( $FORM{'no'} eq $no) { #<<<メンテ対象者の場合 if ( $FORM{'proc'} eq 'edit' ) { # パスワードの暗号化(crypt関数使用)) if ($FORM{'pass'} ne "") { &pass_enc($FORM{'pass'}); } else { $pass = '' ; } push(@new,"$no,$FORM{'name'},$FORM{'email'},$FORM{'hp'},$FORM{'title'},$FORM{'comment'},$regdate,$pass,$hst"); #<<<そのまま出力 } } else { push(@new,$_); } } if ( !(open(OUT,">$logfile"))) { &fileunlock ; &error("ログファイル($logfile)のオープンに失敗しました"); } print OUT @new; close(OUT); &fileunlock ; #ファイルロック解除 if ( $damedame == 0 ) { print "Location: $script?\n\n"; } else { print "Content-type: text/html\n\n"; print "\n\n"; } } ###<------------------------------------------------------------- ###<--- クッキー取得 ###<-------------------------------------------------------------- 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{'kakikomitai2'}); 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'},ps\!$FORM{'pass'}"; print "Set-Cookie: kakikomitai2=$cook; expires=$date_gmt\n"; } ###<-------------------------------------------------------------- ###<--- エラー処理 ###<-------------------------------------------------------------- sub error { &header ; print "$_[0]\n"; &footer; exit; } ###<-------------------------------------------------------------- ###<--- ファイルロック設定 ###<-------------------------------------------------------------- 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; }