山内の授業のページ/09春/プロジェクト?

アクセス数 1220  このページの最終更新 2009-05-10 (日) 16:11:01

セッション管理のサンプルコード

注意: セッションの仕組を理解する/使ってみるためのサンプルであり、実用的にはセキュリティが不十分な点が多い。このまま実用にしてはいけないだろう。

ファイル filemytestauth.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で起動されるスクリプト、filemyaction.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>');

?>

ログアウト処理のページ filemylogout.php は次のようにしてみた。

<?php
session_start();
session_destroy();	// これでセッションを削除する
// 削除しないと、同じブラウザから次に別ユーザでログインしようとしても
// 旧ユーザで使用中なので、別ユーザではログインできない
print("<p>セッション終了</p>");
print('<a href="mytestauth.php">ログイン画面へ戻る</a>');
?>

添付ファイル: filemytestauth.php 485件 [詳細] filemylogout.php 426件 [詳細] filemyaction.php 424件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-05-10 (日) 16:11:01 (3116d)