掲示板

メッセージをサーバーに送る

 

メッセージの履歴

14:59:59 :: 公開版では記録はしません。( あらいぐま :: 10.120.200.88 )

14:53:16 :: clearは特定のホストからでないと実行されない ( わに :: 10.120.200.8 )

14:52:42 :: 名前がなければ再読込と表示だけする。 ( くま :: 10.120.200.7 )

14:53:04 :: でも再読込のボタンも作った ( あひる :: 10.120.200.30 )

14:52:33 :: 名前は自由だがIPアドレスでホストが特定される☆ ( ぞう :: 10.120.200.27 )

14:51:52 :: 最新のものが上になるように整列 ( あひる :: 10.120.200.30 )

14:51:29 :: メッセージはここ ( 名前はここ :: 10.120.200.31 )

14:50:59 :: 開始しました。

解説

「メッセージをサーバーに送る」の部分。

これはhtml5準拠です。

<form action="h11a05.php" method="post">
<p><label>名前:<input name="YourName" size="20" maxlength="20"></label>
 <label>メッセージ:<input name="Message" size="80" maxlength="80"></label></p>
<p><button name="Button" value="send">送信</button></p>
<p><button name="Button" value="reload">再読込</button></p>
<p><button name="Button" value="clear">消去</button></p>
</form>

ここで、h11a05.php はこのデータを処理するphpプログラムを書くファイル名ですが、今回も自分自身になります。

clearはデータがたまりすぎた場合にクリアするボタンです。通信先のIPアドレスで自分のホストだけに許可しています。

「メッセージの履歴」の部分

<?php
$RECDFILE_NAME = "storedata.txt"; //データを保存するファイルの名前
$BASE_PATH = getcwd();            //プログラムのあるディレクトリ
$RECD_FILE = $BASE_PATH . "/" . $RECDFILE_NAME;   //ファイルのパス

$name    = $_POST['YourName'];    //formからのデータ
$message = $_POST["Message"] ;
$button  = $_POST["Button"] ;
$sender  = $_SERVER['REMOTE_ADDR'] ;  //送信してきたアドレスをウェブサーバーから教えてもらう

if ( $button == "reload" ) $name="";

if ( $name ){  //名前が入っている時だけ記録する。
   $time=date("H:i:s");            //時刻を記憶しておく
   $fp = fopen($RECD_FILE,"a");    //ファイルを追記で開く
   stream_set_write_buffer($fp, 0);    //バッファを禁止
   flock($fp, LOCK_EX);            //ファイルを占有にして書き込む
   fputs($fp, "<p>$time :: $message ( $name :: $sender )</p>\n");
   flock($fp, LOCK_UN);            //ファイルの占有を解除
   fclose($fp);                    //ファイルを閉じる(保存)
}
if ( $button == "clear" ){          //押されたのがclearだったら
   if ( $sender == "192.168.200.200"){  //送信者のアドレスが指定のものだったら
      $time=date("H:i:s");            //時刻を記憶しておく
      $fp = fopen($RECD_FILE,"w");    //ファイルを書込で開く
                                    //(同じ名前のファイルがあれば消去される)
      stream_set_write_buffer($fp, 0);
      flock($fp, LOCK_EX);    
      fputs($fp, "<p>$time :: 開始しました。</p>\n");
      flock($fp, LOCK_UN);    
      fclose($fp);            
   }
}

if ( file_exists($RECD_FILE) ){     //ファイルがあった時だけおこなう
   $result = file($RECD_FILE);          //ファイルを読んで配列に格納
   $result = array_reverse($result);    //配列の順序を逆にする
   foreach($result as $line){           //配列の内容を全部書き出す
      print $line;
   }
}
?>

storedata.txt の書き込み許可

ウェブサーバーやphpのシステムが扱うファイルは安全のため書込み禁止になっています。今回はphpがファイルに追加書き込みをしますから書き込みを許可しなければなりません。そこで書込み許可をしたファイルとして storedata.txt を用意しました。

校内だけのルールですが、ファイルを消してしまうと次に作った時には書き込みは許可されていません。また他の名前のファイルを作っても一般ユーザーでは書きこみ許可ができませんので注意してください。

このままインターネットに公開してはいけません

データをhtmlファイルを置く場所においてはいけない
ここは基本的に公開するデータを置く場所です。今回は公開する目的なので問題ないですが、 名前や住所などを書き込んでもらい他の人が書いたものは見えないようにしておくという設計をすることがあります。この場合に表示しないから見えないと思うのは間違いです。
アドレス欄(http://で始まる入力欄)の最後のファイル名をstoredata.txtにして、Enterキーを押すと全部そのまま見えてしまいます。 ウェブの公開範囲外だけれどもphpがアクセスできるという場所を作ってそこに保管します。
タブが書けてしまう。
リンクを書いて仕掛けのあるページに誘導したりできてしまいます。送られた文字列から " < " や " & " を取り去ったり、" &lt; " や " &amp; " に書き換えたりします。
自動投稿ロボット対策
入力フィールドをひとつ新設して、ロボットにはわからない文字を入力してもらう。たとえば変形した文字の画像を判読して入力してもらう。たとえば を表示して、「sotead」と入力してもらうなどです。
本当はデータベースで
ファイルに書くやり方は上記の様にセキュリティ上も問題がありますが、データが多くなったときに作業が遅くなったり、最新のデータのみを1ページに表示してあとは次のページにするとか、スレッドにわけるとかしようとすると困難になったりします。これを解決するのはデータベースです。

課題

上記のページを作りなさい。phpのページファイルは keijiban.php という名前で保存します。index.htmlに「掲示板」という名前の リンクを作ります。

action="h11a05.php" は action="keijiban.php" にしなければなりません。

$sender == "10.10.200.41" は自分のIPアドレスにしないとクリアできません。