200X/00/21
あやふやなままだが・・・2週間はクッキーで遊んでしまった(−−;
返信機能が無いBBSはクッキーを簡単に食わせられたが、レスで違うページを 読みこませて、2回ほどPOSTで処理するときにクッキーがよく死んで、どこで クッキーを食べさせるか?表示させるか??だいぶ悩んでしまった(*^^*ゞ
途中でキャッシュが効いてるんじゃないかとか疑問に思って、キャッシュを無効にする プログラムまで取り入れたり、変数名をやたらと変えてみたり・・・
ちゃんと動くものの・・・やはり疑問な個所はまだまだ有るなぁ・・・(⌒^⌒)bうふっ
まぁ・・・プログラムみてもどうって事無いでしょうが(*^^*ゞ
一応記録の為に下記に記載(改行タグの部分はちゃんと表示されてません)
#!/usr/local/bin/perl
require './jcode.pl';
#カウンター観覧者ログGETの処理ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
if ($ENV{'REQUEST_METHOD'} eq "GET") {
$ip = $ENV{'REMOTE_ADDR'};
$reurl = $ENV{'HTTP_REFERER'};
$host = $ENV{'REMOTE_HOST'};
$bura = $ENV{'HTTP_USER_AGENT'};
( $byou, $hun, $ji, $hi, $tuki, $toshi, $you ) = localtime( time );
$hyouji = sprintf( "%04d年%02d月%02d日",$toshi + 1900, $tuki + 1, $hi );
$youbi = sprintf( "(%s)", ( "日", "月", "火", "水", "木", "金", "土")[$you] );
$jikan = sprintf( "%02d時%02d分%02d秒", $ji, $hun, $byou );
$suuji = "./suuji.txt";
foreach( 1..5) {
if( mkdir($lock, 0755 ) ){
last;
}
else{
sleep( 1 );
}
}
open(SUUJI, "+<$suuji");
@suuji = <SUUJI>;
$kau = $suuji[0] +1;
$suujidata = $kau."\t".$hyouji."\t".$youbi."\t".$jikan."\t".$ip."\t".$reurl."\t".$host."\t".$bura."\n";
unshift( @suuji, $suujidata );
foreach( 300..$#suuji ){
pop @suuji;
}
seek( SUUJI, 0, 0 );
print SUUJI @suuji;
truncate( SUUJI, tell( SUUJI ));
close( SUUJI );
rmdir( $lock );
#クッキー取得ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
$cookie = $ENV{'HTTP_COOKIE'};
( $iran, $address, $name, $url, ) = split( /#/, $cookie );
#クッキーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
}
#フォームからのデータ処理---------------------------------------------------------------------------------------------------
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $naka, $ENV{"CONTENT_LENGTH"});
( $byou, $hun, $ji, $hi, $tuki, $toshi, $you ) = localtime( time );
$hyouji = sprintf( "%04d年%02d月%02d日",$toshi + 1900, $tuki + 1, $hi );
$youbi = sprintf( "(%s)", ( "日", "月", "火", "水", "木", "金", "土")[$you] );
$jikan = sprintf( "%02d時%02d分%02d秒", $ji, $hun, $byou );
$ip = $ENV{'REMOTE_ADDR'};
$reurl = $ENV{'HTTP_REFERER'};
$host = $ENV{'REMOTE_HOST'};
$bura = $ENV{'HTTP_USER_AGENT'};
@nakami = split('&', $naka);
foreach(@nakami) {
($hidari, $migi) = split("=");
$migi =~ tr/+/ /;
$migi =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;

$migi =~ s/\r?\n/
/g;
$migi =~ s/
/
/gi;
&jcode'convert( *migi, 'sjis' );
$kaku{$hidari} = $migi;
}
$name = $kaku{'name'};
$memo = $kaku{'memo'};
$address = $kaku{'address'};
$url = $kaku{'url'};
$dai = $kaku{'dai'};
$resf = $kaku{'resf'};#レスフォームスイッチ
$no = $kaku{'no'};#ログ参照番号
$res = $kaku{'res'};#レスフォームからの送信スイッチ
$rname = $kaku{'rname'};
$rdai = $kaku{'rdai'};
$raddress = $kaku{'raddress'};
$rurl = $kaku{'rurl'};
$rmemo = $kaku{'rmemo'};
$logfile = "./logfile.txt";
$kanrifile = "./kanrifile.txt";

#二重カキコ参照用に管理ファイルのデータを変数メモ1にしておくーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
open( NIJYUU, "$kanrifile");
$nijyuu = <NIJYUU>;
( $a1, $b2, $memo1,$d4, $e5, $f6, $g7, $h8, $i9, $j0, ) = split( /\t/, $nijyuu );
close( NIJYUU );
#レスフォームのスイッチが入ったらサブルーチン$resfへーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
if($resf eq 'resf' ) {
&resf( "$no" );
exit;
}
#レスフォームから送信が有ったらーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
$resdata = "<dl><dt><font size='2'><b>$rdai</b> name: <b><a href='mailto:$raddress'>$rname</a> </b>\[ $hyouji$youbi$jikan ] <a href='$rurl'>[HOME]</a></dt><dd>
$rmemo</font></dd></dl>";
if($res eq 'res' ) {
&res( "$no" );
exit;
}
#二重カキコ処理と未記入エラーの処理----------------------------------------------------------------------------------------
if ($name eq "" or $memo eq ""){
$error="名前かカキコが未記入です(*^^*ゞ。";
}
elsif($memo eq $memo1){
$error="エラーで〜す!2重投稿になっちゃいました(*^^*ゞ。";
}
#普通書き込み処理ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
else{
foreach( 1..5) {
if( mkdir($lock, 0755 ) ){
last;
}
else{
sleep( 1 );
}
}
open(LOGFILE, "+<$logfile");
@logs = <LOGFILE>;
$ban = @logs[0]+1;
$memo =~ s/\r?\n/
/g;
$logdata = $ban."\t".$dai."\t".$address."\t".$name."\t".$hyouji."\t".$youbi."\t".$jikan."\t".$url."\t".$memo."\n";
unshift( @logs, $logdata );
foreach( 15..$#logs ){
pop @logs;
}
seek( LOGFILE, 0, 0 );
print LOGFILE @logs;
truncate( LOGFILE, tell( LOGFILE ));
close( LOGFILE );
open(KANRIFILE, "+<$kanrifile");
@kanri = <KANRIFILE>;
$nan = $kanri[0] +1;
$kanridata = $nan."\t".$name."\t".$memo."\t".$hyouji."\t".$youbi."\t".$jikan."\t".$ip."\t".$reurl."\t".$host."\t".$bura."\n";
unshift( @kanri, $kanridata );
foreach( 100..$#kanri ){
pop @kanri;
}
seek( KANRIFILE, 0, 0 );
print KANRIFILE @kanri;
truncate( KANRIFILE, tell( KANRIFILE ));
close( KANRIFILE );
rmdir( $lock );
}
}
#クッキーの発行ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
$kigen = 'Mon, 01 jan 2007 00:00:00 GMT';
$cdata = "#".$address."#".$name."#".$url."#";
print "Set-Cookie: tensyubbs=$cdata; expires=$kigen\n";

( $sec, $min, $hour, $day, $mon, $year, $wday ) = localtime( time );
$month = sprintf( "%s", ( "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" )[$man] );
$youbi = sprintf( "%s", ( "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat")[$you] );
$jikan = sprintf( "%s, %02d %s %04d %02d:%02d:%02d GMT", $youbi, $day, $month, $year+1900, $hour, $min, $sec );
print "Last-Modified: $jikan\n";
print "Expires: 0\n";
print "Content-type: text/html\n\n";
#頭の部分表示HTML吐き出し部分ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
print <<MAMA;
<META HTTP-EQUIV="Content-type"CONTENT="text/html"CHARSET="Shift_JIS">
<HTML>
<HEAD>
<TITLE>お気軽掲示板</TITLE>
<STYLE TYPE="text/css">
<!--
A:hover { color: red; }
a {text-decoration:none}
-->
</STYLE>
</HEAD>
MAMA
#カウンター表示ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
$suuji = "./suuji.txt";
open( KAUNTA, "$suuji");
$kaunta = <KAUNTA>;
( $aa, $bb, $dd, $ee, $ff, $gg, $hh, $ii ) = split( /\t/, $kaunta );
close( KAUNTA );
print "<font size='2'><b>$aa</b></font>
";
#フォーム表示ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
print <<MAMA;
<BODY vlink="#000000" link="#000000" >
<hr>
<center><font size="+1"><b>TEST-BBS</b></font></center>
<FORM METHOD="POST" ACTION=\"****.cgi\" \n>
<center><table border="0" align="center" width="400">
<tr><td align="center">
<b>お名前</b><font size="2">(省略不可)</font><INPUT NAME="name" SIZE="45"VALUE="$name"></td></tr>
<tr><td align="center">
<b>題名.......</b><font size="2">(省略可)</font><INPUT NAME="dai" SIZE="45" value="no title"></td></tr>
<tr><td align="center">
<b>e-mail...</b><font size="2">(省略可)</font><INPUT NAME="address" SIZE="45"VALUE="$address"></td></tr>
<tr><td align="center">
<b>URL......</b><font size="2">(省略可)</font><INPUT NAME="url" SIZE="45" VALUE="$url"></td></tr></tr>
<tr><td align="center">
<TEXTAREA NAME="memo" ROWS ="5" COLS="54"></TEXTAREA></tr></td>
<tr><td align="center"><font size="2">(タグ有効)無茶なタグは打たないで下さい、壊れやすい掲示板(*^^*ゞ</font>

<INPUT TYPE="submit" VALUE="送信" > <INPUT TYPE="reset" VALUE="取り消し"></tr></td>
</table></center>
</FORM>
MAMA
#エラーメッセの表示個所ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
print "<CENTER><font><B>$error</B></font>
</CENTER>";
#カキコ表示部分ログファイルの参照ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
$logfile = "./logfile.txt";
open(LOGFILE, "$logfile");
@logs = <LOGFILE>;
foreach $kakiko ( @logs ){

chomp( $kakiko );
( $ban, $dai, $address, $name, $hyouji, $youbi, $jikan, $url, $memo, ) = split( /\t/, $kakiko, );

if($a > 15 ){
$a = 0;
}
$a += 1;
$b = $a - 1;
print <<MAMA;
<center>
<table width='600' border='2'>
<tr><td width="95%">
<font size='2'>[$ban]</font> <b><font size='2'>$dai</font></b> </font>
<font size='2'>name: <b><a href='mailto:$address'>$name</a> </b>
\[ $hyouji$youbi$jikan ] 
<a href='$url'>[HOME]</a></td>
</font>
<td align='center' width='15%'>
<FORM METHOD="POST" ACTION=\"*****.cgi\" \n>
<input type=hidden name=resf value="resf">
<input type=hidden name=no value=$b>
<input type=submit value="返信">
</td></tr>
<td colspan='2'><font color='$color'><blockquote><font size="2">
$memo</font></blockquote></font></td></tr>
</table></form>
</center>
MAMA
}
close( LOGFILE );
#偉そうに著作権の表示(*^^*ゞーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
print "<center>Copyright(C) tensyu</center>";
print "</html>";
print "</body>";
#返信ボタンが押されたときのサブルーチンーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
sub resf {
my( $resmsg ) = @_;
$logfile = "./logfile.txt";
open(LOGFILE, "$logfile");
@logs = <LOGFILE>;
($ban, $dai, $address, $name, $hyouji, $youbi, $jikan, $url, $memo ) = split(/\t/,$logs[$resmsg] );
close (LOGFILE);

#クッキー取得ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
$cookie = $ENV{'HTTP_COOKIE'};
( $firan, $faddress, $fname, $furl, ) = split( /#/, $cookie );
#クッキーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
print "Content-type: text/html\n\n";
print <<MAMA;
<BODY vlink="#000000" link="#000000">
<center>
<table width='600' border='2'>
<tr><td>
<font size="2">[$ban]</font> <b>$dai</b> 
<font size='2'>name: <b><a href='mailto:$address'>$name</a> </b>
\[ $hyouji$youbi$jikan ] 
<a href='$url'>[HOME]</a></td></font>
</tr><td colspan='2'><font color='$color'><blockquote>$memo</blockquote></font></td></tr>
</table></form>
</center>
MAMA
print <<MAMA;
<center><font size="+1"><b>↑返信フォームです。
(Cookieは食べません)</b></font></center>
<FORM METHOD="POST" ACTION=\"*****.cgi\" \n>
<input type=hidden name=res value="res">
<input type=hidden name=no value=$resmsg>
<center><table border="0" align="center" width="400">
<tr><td align="center">
<b>お名前</b><font size="2">(省略不可)</font><INPUT NAME="rname" SIZE="45"VALUE="$fname"></td></tr>
<tr><td align="center">
<b>題名.......</b><font size="2">(省略可)</font><INPUT NAME="rdai" SIZE="45" value="RE:$dai"></td></tr>
<tr><td align="center">
<b>e-mail...</b><font size="2">(省略可)</font><INPUT NAME="raddress" SIZE="45"VALUE="$faddress"></td></tr>
<tr><td align="center">
<b>URL......</b><font size="2">(省略可)</font><INPUT NAME="rurl" SIZE="45" VALUE="$furl"></td></tr></tr>
<tr><td align="center">
<TEXTAREA NAME="rmemo" ROWS ="5" COLS="54"></TEXTAREA></tr></td>
<tr><td align="center"><font size="2">(タグ有効)無茶なタグは打たないで下さい、壊れやすい掲示板(*^^*ゞ</font>

<INPUT TYPE="submit" VALUE="送信" > <INPUT TYPE="reset" VALUE="取り消し"></tr></td>
</table></center>
</FORM>
</body></html>
MAMA
}
#返信フォームからのログ書き換えのサブルーチン-------------------------------------------------------------------------------
sub res {
my( $resmsg ) = @_;

$logfile = "./logfile.txt";
foreach( 1..5) {
if( mkdir($lock, 0755 ) ){
last;
}
else{
sleep( 1 );
}
}
$logfile = "./logfile.txt";
open(LOGFILE, "+<$logfile");
@logs = <LOGFILE>;
chomp( $logs[$resmsg] );
($ban, $dai, $address, $name, $hyouji, $youbi, $jikan, $url, $memo ) = split(/\t/,$logs[$resmsg] );
$logs[$resmsg] =$ban."\t".$dai."\t".$address."\t".$name."\t".$hyouji."\t".$youbi."\t".$jikan."\t".$url."\t".$memo.$resdata."\n";
seek( LOGFILE, 0, 0 );
print LOGFILE @logs;
truncate( LOGFILE, tell( LOGFILE ));
close( LOGFILE );
#クッキー取得ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
$cookie = $ENV{'HTTP_COOKIE'};
( $riran, $raddress, $rname, $rurl, ) = split( /#/, $cookie );
#クッキーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
print "Content-type: text/html\n\n";
rmdir( $lock );
print <<MAMA;
<META HTTP-EQUIV="Content-type"CONTENT="text/html"CHARSET="Shift_JIS">
<HTML>
<HEAD>
<TITLE>お気軽掲示板</TITLE>
<STYLE TYPE="text/css">
<!--
A:hover { color: red; }
a {text-decoration:none}
-->
</STYLE>
</HEAD>
MAMA
#カウンター表示ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
$suuji = "./suuji.txt";
open( KAUNTA, "$suuji");
$kaunta = <KAUNTA>;
( $aa, $bb, $dd, $ee, $ff, $gg, $hh, $ii ) = split( /\t/, $kaunta );
close( KAUNTA );
print "<font size='2'><b>$aa</b></font>
";
#フォーム表示ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
print <<MAMA;
<BODY vlink="#000000" link="#000000" >
<hr>
<center><font size="+1"><b>TEST-BBS</b></font></center>
<FORM METHOD="POST" ACTION=\"*****.cgi\" \n>
<center><table border="0" align="center" width="400">
<tr><td align="center">
<b>お名前</b><font size="2">(省略不可)</font><INPUT NAME="name" SIZE="45"VALUE="$rname"></td></tr>
<tr><td align="center">
<b>題名.......</b><font size="2">(省略可)</font><INPUT NAME="dai" SIZE="45" value="no title"></td></tr>
<tr><td align="center">
<b>e-mail...</b><font size="2">(省略可)</font><INPUT NAME="address" SIZE="45"VALUE="$raddress"></td></tr>
<tr><td align="center">
<b>URL......</b><font size="2">(省略可)</font><INPUT NAME="url" SIZE="45" VALUE="$rurl"></td></tr></tr>
<tr><td align="center">
<TEXTAREA NAME="memo" ROWS ="5" COLS="54"></TEXTAREA></tr></td>
<tr><td align="center"><font size="2">(タグ有効)無茶なタグは打たないで下さい、壊れやすい掲示板(*^^*ゞ</font>

<INPUT TYPE="submit" VALUE="送信" > <INPUT TYPE="reset" VALUE="取り消し"></tr></td>
</table></center>
</FORM>
MAMA
#エラーメッセの表示個所ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
print "<CENTER><font><B>$error</B></font>
</CENTER>";
#カキコ表示部分ログファイルの参照ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
$logfile = "./logfile.txt";
open(LOGFILE, "$logfile");
@logs = <LOGFILE>;
foreach $kakiko ( @logs ){

chomp( $kakiko );
( $ban, $dai, $address, $name, $hyouji, $youbi, $jikan, $url, $memo, ) = split( /\t/, $kakiko, );

if($a > 15 ){
$a = 0;
}
$a += 1;
$b = $a - 1;
print <<MAMA;
<center>
<table width='600' border='2'>
<tr><td width="95%">
<font size='2'>[$ban]</font> <b><font size='2'>$dai</font></b> </font>
<font size='2'>name: <b><a href='mailto:$address'>$name</a> </b>
\[ $hyouji$youbi$jikan ] 
<a href='$url'>[HOME]</a></td>
</font>
<td align='center' width='15%'>
<FORM METHOD="POST" ACTION=\"****.cgi\" \n>
<input type=hidden name=resf value="resf">
<input type=hidden name=no value=$b>
<input type=submit value="返信">
</td></tr>
<td colspan='2'><font color='$color'><blockquote><font size="2">
$memo</font></blockquote></font></td></tr>
</table></form>
</center>
MAMA
}
close( LOGFILE );
#偉そうに著作権の表示(*^^*ゞーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
print "<center>Copyright(C) tensyu</center>";
print "</html>";
print "</body>";
}
#以上おしまいーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
exit;