#!/usr/local/bin/perl #=============管理人の情報ここから=============# $admin_url = ""; #管理人のHPトップアドレス $admin_name = ""; #管理人の名前 $admin_mail = ""; #管理人のメールアドレス #=============管理人の情報ここまで=============# #===========通常変更可能区域ここから===========# $F_TITLE = "簡易掲示板"; #タイトルの名前 $I_TITLE = "./"; #画像の名前と場所 $IMG = "0"; #タイトルが画像なら1、文字なら0 初期値0 $TITLECOLOR = "000000"; #タイトルの色 $TITLESIZE = "+3"; #タイトルの大きさ $BGCOLOR = "\#eeeeff"; #バックの色指定 $cook_name = "name"; #クッキーの名前 $max_word = 1200; #一回の書き込みにおける最大コメント文字数(半角) $expire = gmtime(time+60*60*24*30);#クッキーの保存期間 基本30日(30の部分だけ変更許可) $MAX = "50"; #保存できる最大数 $max = "10"; #1ページに表示できる数 $count = "./count.txt"; #count.txtの名前 及び場所 $cgifile = "./guestbook.cgi"; #CGIファイルの名前 及び場所 $logfile = "./logfile.txt"; #ログファイルの名前 及び場所 require "./jcode.pl"; #jcode.plの場所(名前変更不可) require "./filelock.pl"; #filelock.plの場所(名前変更不可) #===========通常変更可能区域ここまで===========# ######################################### # # データの取りこみ # ######################################### if($ENV{'REQUEST_METHOD'} eq "POST"){ read STDIN,$QUERY,$ENV{'CONTENT_LENGTH'}; } else{ $QUERY = $ENV{'QUERY_STRING'}; } @QUERY = split /&/,$QUERY; foreach(@QUERY){ ($key,$val) = split /=/; $key =~ tr /+/ /; $val =~ tr /+/ /; $key =~ s/%([a-fA-F0-9][a-fA-f0-9])/pack("c",hex($1))/ge; $val =~ s/%([a-fA-F0-9][a-fA-f0-9])/pack("c",hex($1))/ge; $val =~ s//>/g; $val =~ s/\"/"/g; $val =~ s/\n/
/g; &jcode::convert(*key, 'sjis'); &jcode::convert(*val, 'sjis'); $form{$key} = $val; } if($form{name}){ if(($form{body} eq "") || ($form{body} > "$max_word")){&error("内容が書かれてません。もしくは規定数以上の文字が書かれてます。");} if($form{title} eq ""){$form{title} = "無題";} if((($form{mail} !~ /(.*)\@(.*)\.(.*)/) && ($form{mail})) || (length($form{mail}) > 120)){&error("メールアドレスの間違いです。もしくは文字数制限を過えています。");} $form{url} =~ s/http\:\/\///; if (length($form{url}) > 150) {&error("URLの文字数制限を越えてます。");} &dubble; #二重投稿の禁止 &roaddata; #データの取得 &counter; #カウンターの取得 &ipdata; #IPの取得 &gettime; #時間の取得 &savedata; #データの保存 if($form{cookie}){&set_cookie;} } ######################################### # # HTMLフォーム部分 # ######################################### &get_cookie; #クッキーの取得 print "Content-type: text/html\n\n"; if($IMG == 0){ $M_TITLE = "$F_TITLE"; } if($IMG == 1){ $M_TITLE = ""; } print <$F_TITLE
$M_TITLE

投稿者
メール
タイトル
内容
URL     クッキーを保存する
HTML print "
書いた通りに記入されるので、適当に改行を入れてください。タグは一切使えません。
"; print "最大で$MAX件保存できます。それを越えた場合、古い方から消えていきます。

"; ######################################### # # ログ表示部分 # ######################################### if($form{start}){$first = $form{start};} else{$first = 0;} $end = $first + ($max - 1); &roaddata; for($i = $first;$i <= $end;$i++){ last if $i >= @data; $DATA = $data[$i]; ($COUNT,$name,$mail,$title,$body,$url,$TIME) = split /\t/,$DATA; print < [$COUNT] $title      HTML if($mail =~ /^\s*$/){print "投稿者:$name  投稿日:$TIME";} else{print "投稿者:$name  投稿日:$TIME";} print <
$body
HTML if($url =~ /^\s$/){print ""} else{print "
http://$url
";} print <
HTML } if(@data > $i){ if(@data > $max){ $first = $end + 1; print "次の$max件 "; } } if($first > $max){ print "掲示板のトップへ "; } print "ホームページへ

"; #[著作権表示(表\示必須)] print < 管理人:$admin_name
超簡易掲示板 v0.99 [ゼノいんぽっしぶる] HTML print ""; ######################################### # # サブルーチン部分 # ######################################### sub set_cookie{ #クッキーの発行 $cook="name\:$form{name}\,mail\:$form{mail}\,url\:$form{url}"; print "Set-Cookie: $cook_name=$cook; expires=$expire\n"; if($form{name}){$COOKIE{name} = $form{name};} if($form{mail}){$COOKIE{mail} = $form{mail};} if($form{url}){$COOKIE{url} = $form{url};} } sub get_cookie{ #クッキーの取得 @pairs = split(/;/,$ENV{'HTTP_COOKIE'}); foreach $pairs (@pairs){ ($name,$val) = split(/=/,$pairs); $name =~ s/ //g; $DUMMY{$name} = $val; } @pairs = split(/,/,$DUMMY{$cook_name}); foreach $pairs (@pairs){ ($name,$val) = split(/:/,$pairs); &jcode::convert(*name, 'sjis'); $COOKIE{$name} = $val; } } sub ipdata{ #各IPデータの取得 $ip_a = $ENV{'REMOTE_ADDR'}; $ip_h = $ENV{'REMOTE_HOST'}; } sub gettime{ #時間の取得 @date = localtime; $date[4] += 1; $date[5] += 1900; @youbi = ("月","火","水","木","金","土","日"); $time = "$date[5]年$date[4]月$date[3]日$youbi[$date]曜日$date[2]時$date[1]分$date[0]秒"; } sub roaddata{ #データの読み取り &filelock::lock(); open OUT,"$logfile" || &error('ログファイルが開けません'); @data = ; close OUT; &filelock::unlock(); } sub savedata{ #データの保存 unshift (@data,"$counter\t$form{name}\t$form{mail}\t$form{title}\t$form{body}\t$form{url}\t$time\t$ip_a\t$ip_h\n"); &filelock::lock(); open IN,">$logfile" || &error('ログファイルに書き込めません'); print IN @data; close IN; &filelock::unlock(); if(@data > $MAX){pop @data;} } sub counter{ #カウンタの取得 &filelock::lock(); open COUNT,"<$count"; $counter = ; close COUNT; &filelock::unlock(); ++$counter; &filelock::lock(); open COUNT,">$count"; print COUNT $counter; close COUNT; &filelock::unlock(); } sub dubble{ #二重投稿の禁止 &filelock::lock(); open OUT,"$logfile" || &error('ログファイルが開けません'); @d_data = ; ($d_count,$d_name,$d_mail,$d_title,$d_body,$d_url) = split(/\t/,$d_data[0]); close OUT; &filelock::unlock(); if(($d_name eq $form{name}) && ($d_mail eq $form{mail}) && ($d_title eq $form{title}) && ($d_body eq $form{body}) && ($d_url eq $form{url})){&error("二重投稿です。");} } sub error{ #その他エラー表示 print "Content-type: text/html\n\n"; print "$_[0]"; exit; } __END__