集中講義:インターネットソフトウェア 講師:白土浩

集中講義:インターネットソフトウェア
講師:白土 浩
学籍番号: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
上記の結果より、変更が加えられたユーザ情報がわかるメールが送信できたことが確認できる。
´