集中講義:インターネットソフトウェア 講師:白土 浩 学籍番号:065763J 氏 名:與儀那広 課題 1.1:ユーザ情報変更ページ 各ユーザ亊のログイン名,ハンドル名,本名,生年月日等をセッション変数として登録 ユーザ情報を入力できるように session-login.php に以下のソースを追加した。 ☆★ 省略 ☆★ <body bgcolor="white"> <? if(isset($_POST["student_id"])){ // データが POST された? $student_id = trim($_POST["student_id"]); $password = trim($_POST["password"]); $handle_name = trim($_POST["handle_name"]); $real_name = trim($_POST["real_name"]); $birth_date = trim($_POST["birth_date"]); ☆★ 省略 ☆★ <form action="" method="post"> ID: <input type="text" name="student_id"><br> パスワード: <input type="password" name="password"><br> ハンドルネーム: <input type="text" name="handle_name"><br> 本名: <input type="text" name="real_name"><br> 生年月日: <input type="text" name="birth_date"><br> <br> <input type="submit" value="ログイン"> <input type="reset" value="クリア"> <br> </form> ☆★ 省略 ☆★ ユーザのハンドルネームや本名、生年月日を POST 通信で送信し、セッション変数にその情報を保持するように編集した。 また、session-main.php も以下のように編集した。 ☆★ 省略 ☆★ <h1>メインメニュー</h1> <?= $_SESSION[’student_id’] ?>さんこんにちは <br><br> <h3>ユーザ情報</h3> <ul> <li>ログインネーム:<?= $_SESSION[’student_id’] ?></li> <li>ハンドルネーム:<?= $_SESSION[’handle_name’] ?></li> <li>本名:<?= $_SESSION[’real_name’] ?></li> <li>生年月日:<?= $_SESSION[’birth_date’] ?></li> </ul> <br> ☆★ 省略 ☆★ セッション変数に格納されたユーザ情報を表示するように編集した。 課題 1.2:訪問履歴 (日時) 参照ページ カウンタを拡張して,クッキーもしくはセッション変数に前回 (可能であれば,過去3回程度まで) のログイン日時を表 示するページにせよ session-login.php に以下のソースを追加した。 ☆★ 省略 ☆★ if(!empty($_SESSION[’login_times’])) { array_shift($_SESSION[’login_times’]); array_push($_SESSION[’login_times’], time()); } else { $_SESSION[’login_times’] = array(0, 0, time()); } ☆★ 省略 ☆★ セッション変数に login times という配列を作成して過去3回分のログイン日時を記録していく。もし、配列 login times が空な ら現在の日時を格納し、空でなければ array shift() 関数で配列の中身をひとつシフトさせ空きを1つ作る。そして array push() 関数で配列の末尾に現在の日時を格納するように編集した。また sessionmain.php も以下のように編集した。 ☆★ 省略 ☆★ <h1>メインメニュー</h1> <?= $_SESSION[’student_id’] ?>さんこんにちは <br><br> ☆★ 省略 ☆★ <? if(!empty($_SESSION[’login_times’])) { ?> <h4>ログイン情報</h4> <ol> <? $times = array_reverse($_SESSION[’login_times’]); foreach($times as $val) { if($val != 0) { echo "<li>".date("Y/m/d H:i:s", $val)."</li>"; } } ?> </ol> <? } ?> <a href="session-login.php">ログイン画面に戻る</a><br> <? } ?> </body></html> もし、配列 login times の中身があるなら foreach で1つずつ要素を取り出して出力しているが、ログイン日時は time() 関 数の返り値である Unix エポック (1970 年 1 月 1 日 00:00:00 GMT) からの通算秒を利用しているので、そのまま出力すると 非常にわかりにくい。なので、ヒトが見やすい形式で出力するように編集した。 ログイン日時をセッション変数に記録することで、クッキーのようにクライアント側に情報が保存されるのではなく、サー バ側に記録されるので改ざんされにくい。また、セッション変数はクッキーと違い ASCII 文字列以外も扱うことができる。 課題 1.3:ログインページの拡張1 現在はログインのパスワードを未設定としているが,ユーザ名入力時に表示するページ内に任意 (乱数) の英数字 (六文字 程度) を表示させて,これをパスワードとするようなページに拡張せよ session-login.php に以下のソースを追加した。 ☆★ 省略 ☆★ #if(empty($student_id) || empty($password)){ if(empty($student_id) || strcmp($password, $_SESSION[’password’]) != 0){ ?> <h1>ログイン失敗</h1> ID が未入力か、パスワードが間違えています.<BR> <a href="session-login.php">再ログイン</a> <? ☆★ 省略 ☆★ <h1>ログイン完了</h1> <?= $student_id ?>さん ○×システムへようこそ!<br> <a href="session-main.php?<? echo strip_tags(SID) ?>">メインページ</a><br> <a href="session-login.php">別 ID でのログイン</a> <? } } else { $pw = pwgen(8); $_SESSION[’password’] = $pw; ?> <h1>ログインフォーム</h1> ID とパスワードを入力して下さい。 パスワード ==> <span style="color:#fff; background-color:#f00;"><?= $pw ?></span> <br> <br> <form action="" method="post"> ☆★ 省略 ☆★ <? function pwgen($len) { $pw = ""; for($i=0; $i<$len; $i++) { $pw .= chr(mt_rand(33, 126)); } return $pw; } ?> ユーザが求めた長さの英字、数字、記号を含むランダムな文字列を作成する pwgen() という関数を作成した。ユーザがログ インする際に、この関数を呼び出して適当なパスワードを作成し画面に出力して入力できるようにする。また、ユーザが入力 した文字列 ( POST 通信で受け取った文字列) と比較できるように、作成したパスワードをセッション変数に格納しておく。そ して、生成したパスワードと入力された文字列を比較し、同じでなければログインに失敗したことを伝えるメッセージを出力 し、同じならログイン成功のメッセージを出力する。 pwgen() 関数では、mt rand() 関数を用いて “33” から “126” の範囲内のランダムな整数値を発生させる。この範囲は ASCII コードの空白を除く記号と英数字に対応している。なので、chr() 関数でランダムな整数値を文字に変換している。生成するパ スワードの長さを引き数で受け取り、ランダムな整数値から文字を作成して結合することを繰り返して、パスワードを生成し ている。 課題 1.4:ログインページの拡張2 ログインページにおいて,クッキー変数が利用可能であれば,ユーザ名のデフォルト値として予め表示せよ session-login.php に以下のようなソースを追加した。 <? // セッション開始 session_start(); $cookie = "default_name"; if(isset($_COOKIE[$cookie])) { $default_name = $_COOKIE[$cookie]; } if(isset($_POST[’student_id’])) { setcookie($cookie, $_POST[’student_id’], time()+365*24*3600); } ?> <? header("Content-type: text/html;charset=UTF-8"); ?> <html> ☆★ 省略 ☆★ <form action="" method="post"> ID: <input type="text" name="student_id" value="<?= $default_name ?>"><br> パスワード: <input type="password" name="password"><br> ☆★ 省略 ☆★ default name という名前のクッキーが存在するなら (前回、ログインした記録がクッキーに残っているなら)、値を取り出し 変数に代入する。この変数の値を input タグの変数 value に代入することで入力フィールドにユーザ名が表示されるようにな る。また、もし POST 変数で student id に何か値が格納されているなら (ユーザがログインしたなら)、そのログインネーム を default name という名前のクッキーに保存するようにした。これで、次回以降のログインの際は、ユーザ名を入力する手間 が無くなる。 課題 1.5:ユーザ情報変更ページの拡張 ユーザ情報変更ページにおいて,変更された個人情報をユーザ宛にメール送信するようにせよ session-login.php に以下のようなソースコードを追加した。 ☆★ 省略 ☆★ <h1>ログイン失敗</h1> ID が未入力か、パスワードが間違えています.<BR> <a href="session-login.php">再ログイン</a> <? } else { if($_SESSION[’student_id’] != $student_id) $old_info[’student_id’] = $_SESSION[’student_id’]; $_SESSION[’student_id’] = $student_id; if($_SESSION[’handle_name’] != $handle_name) $old_info[’handle_name’] = $_SESSION[’handle_name’]; $_SESSION[’handle_name’] = $handle_name; if($_SESSION[’real_name’] != $real_name) $old_info[’real_name’] = $_SESSION[’real_name’]; $_SESSION[’real_name’] = $real_name; if($_SESSION[’birth_date’] != $birth_date) $old_info[’birth_date’] = $_SESSION[’birth_date’]; $_SESSION[’birth_date’] = $birth_date; ☆★ 省略 ☆★ <h1>ログイン完了</h1> <?= $student_id ?>さん ○×システムへようこそ!<br> <a href="session-main.php?<? echo strip_tags(SID) ?>">メインページ</a><br> <a href="session-login.php">別 ID でのログイン</a> <? if(!empty($old_info)) { $MailTo = "[email protected]"; $subject = "Modified User Info"; $message = "ログインネーム:"; if(!empty($old_info[’student_id’])) $message .= $old_info[’student_id’]." ===> "; $message .= $_SESSION[’student_id’]; $message .= "\n ハンドルネーム:"; if(!empty($old_info[’handle_name’])) $message .= $old_info[’handle_name’]." ===> "; $message .= $_SESSION[’handle_name’]; $message .= "\n 本名:"; if(!empty($old_info[’real_name’])) $message .= $old_info[’real_name’]." ===> "; $message .= $_SESSION[’real_name’]; $message .= "\n 生年月日:"; if(!empty($old_info[’birth_date’])) $message .= $old_info[’birth_date’]." ===> "; $message .= $_SESSION[’birth_date’]; mb_language("ja"); mb_internal_encoding("UTF-8"); mb_send_mail($MailTo, $subject, $message); } } } else { $pw = pwgen(8); $_SESSION[’password’] = $pw; ?> ☆★ 省略 ☆★ POST 通信でユーザが入力した情報をセッション変数に代入する前に、現在、保持しているセッション変数の内容 (前回、ロ グインした時にユーザが入力した情報) と比較して、同じではなかった (ユーザ情報が変更された) 場合、old info という連想配 列に前回入力した値をコピーする。 ログインが完了した後に、連想配列 old info の中身があるかを調べ、もしあるならユーザ情報が変更されたということなの で、どの情報はどう変更されたかわかるような文字列を作成し、これを本文の内容にして変数 MailTo で指定されたアドレス にメールを送信するようにした。 ちゃんとメールが送信できるかを確かめるためにまず、“ユーザ名:e065763、ハンドルネーム:zyugemu、本名:長助、生 年月日:1986/04/01” と入力してログインをし、ログインが無事成功したことを確認した後、再びログイン画面に進む。そし て、ユーザ情報のハンドルネームと本名を変えて、もう一度ログインを試みてみた。ログインに成功すると以下のようなメー ルが指定したアドレスに届いた。 ¶ µ ³ 件名:Modified User Info 本文: ログインネーム:e065763 ハンドルネーム:zyugemu ===> 寿限無 本名:長助 ===> tyo-suke 生年月日:1986/04/01 上記の結果より、変更が加えられたユーザ情報がわかるメールが送信できたことが確認できる。 ´
© Copyright 2024 ExpyDoc