⇒山内の授業のページ/09春/プロジェクト?
アクセス数 1513 このページの最終更新 2009-05-10 (日) 16:11:01
注意: セッションの仕組を理解する/使ってみるためのサンプルであり、実用的にはセキュリティが不十分な点が多い。このまま実用にしてはいけないだろう。
ファイル mytestauth.php はメインの画面になる。
<?php // ユーザ名入力画面からデータを取り込む $id = $_POST["userid"]; $pass = $_POST["password"]; // データベース上のテーブルunameで探して、正しいユーザか確認する include(".ht_mypassword"); $MyLink = mysql_connect($MySQLHost, $MySQLUserName, $MySQLPassword); $MySQLDatabase = 'test'; mysql_select_db($MySQLDatabase, $MyLink); $Query = "SELECT password FROM useridtable WHERE name='". $id . "'"; $Result = mysql_query($Query, $MyLink); if ( ($numrows = mysql_num_rows($Result)) == 0 ) { //もしヒットしなければ // print("<p>ユーザ名/パスワードが間違っています1</p>"); // もう一度、ログイン認証 print('<form action="mytestauth.php" method="POST">'); print('ユーザID <input type="text" name="userid" size="16"><br>'); print('パスワード <input type="password" name="password" size="16"><br>'); print('<INPUT type="submit" name="send" value="送信"><br>'); print('</form>'); return; } else { // ヒットしたが $Row = mysql_fetch_array($Result, MYSQL_ASSOC); if ($pass != $Row["password"]) { // もしパスワードが合っていなければ // print("<p>ユーザ名/パスワードが間違っています2</p>"); // もう一度、ログイン認証 print('<form action="mytestauth.php" method="POST">'); print('ユーザID <input type="text" name="userid" size="16"><br>'); print('パスワード <input type="password" name="password" size="16"><br>'); print('<INPUT type="submit" name="send" value="送信"><br>'); print('</form>'); return; } } // これでOKなので、セッション確認 session_start(); if (!isset($_SESSION['id'])) { // 初めて使うので$_SESSION['id']に値がセットされていない $_SESSION['id'] = $id; $_SESSION['password'] = $pass; //ユーザIDとパスワードをSESSION変数にしまって置く } else if ($_SESSION['id']!=$id) { // 既に別名のセッションが開始している print("<p>" . $_SESSION['id'] . "</p>"); print('<p>セッションがおかしい</p>'); return; } else { $_SESSION['id'] = $id; $_SESSION['password'] = $pass; //この代入は要らないかもしれない。 } // ここからページ本体 print('<h1>私のページ</h1>'); print('<FORM action="myaction.php" method="post">'); print('<P><TEXTAREA rows="3" cols="20" name="freecomment">コメント</TEXTAREA></P>'); print('<P>動物がすき?'); print('<INPUT type="radio" name="animal" value="yes">はい'); print('<INPUT type="radio" name="animal" value="no">いいえ'); print('<INPUT type="radio" name="animal" value="neither">どちらでもない'); print('</P>'); print('<P><INPUT type="submit" name="send" value="送信"></P>'); print('</FORM>'); ?>
これに対してFORMで起動されるスクリプト、myaction.php はこんな風に作ることができる。
<?php // 中で使う関数mymatchを定義 function mymatch( $myid, $mypassword) { // 引数で与えられた$myid, $mypasswordがあるとき、データベース内の // ユーザIDの表(useridtable)中に、マッチするエントリつまり // (name,password)==($myid,$mypassword)となるエントリがあるか検索し、 // あればtrueを、なければfalseを返す関数 include(".ht_mypassword"); $MyLink = mysql_connect($MySQLHost, $MySQLUserName, $MySQLPassword); $MySQLDatabase = 'test'; mysql_select_db($MySQLDatabase, $MyLink); $Query = "SELECT password FROM useridtable WHERE (name='". $myid . "' and password='" . $mypassword . "')"; $Result = mysql_query($Query, $MyLink); if ( ($numrows = mysql_num_rows($Result)) == 0 ) { //もしヒットしなければ return false; } else { //ヒットすれば return true; } } // 先頭でセッション中であるかどうかをチェックする // このチェックはすべてのページに必要。横から飛び込むことを禁止する。 // (トップページが入り口で1回しか使われないなら、そこでは不要) session_start(); if (!isset($_SESSION['id'])) { // セッション情報が未設定 print("<p>不正アクセス1" . $_SESSION['id'] . "</p>"); return; } else if (!mymatch($_SESSION['id'], $_SESSION['password'])) { // セッション情報が不適当 print("<p>不正アクセス2</p>"); } // ここまでチェック $comment = $_POST["freecomment"]; $animal = $_POST["animal"]; print("<p>名前 :" . $name . "</p>\n"); print("<p>コメント:" . $comment . "</p>\n"); print("<p>パスワード:" . $pass . "</p>\n"); print("<p>どの果物:" . $fruit1result . ", " . $fruit2result . ", " . $fruit3result . "</p>\n"); print("<p>動物好き:" . $animal . "</p>\n"); // ログアウトボタン 〜 セッション情報を消去するためにぜひログアウト処理が必要で、それを呼び出す。 print("<p></p> <p></p>"); print('<form action="mylogout.php" method="POST">'); print('<INPUT type="submit" name="send" value="ログアウト">'); print('</form>'); ?>
ログアウト処理のページ mylogout.php は次のようにしてみた。
<?php session_start(); session_destroy(); // これでセッションを削除する // 削除しないと、同じブラウザから次に別ユーザでログインしようとしても // 旧ユーザで使用中なので、別ユーザではログインできない print("<p>セッション終了</p>"); print('<a href="mytestauth.php">ログイン画面へ戻る</a>'); ?>