PHP を使用するデータベース駆動型アプリケーションの作成
レッスン 5: セキュリティーの追加。ユーザーログオンアプリケーションの実装
このレッスンでは、ウィッシャー用のログオン機能を実装します。これは次のファイルに影響します。
index.php
createNewWisher.php
editWishlist.php
db.php
ログオン機能の実装は、次の手順で構成されています。
ウィッシャーの作成時に、セッションにウィッシャーの ID を保存する
ウィッシュリストを編集しようとするユーザーがログインしていることを検査する
index.php ページからウィッシャーがログオンする
現在のドキュメントは、PHP チュートリアル「NetBeans IDE for PHP での CRUD アプリケーションの作成」の一部です。
前のレッスンからのアプリケーションソースコード
MySQL ユーザー: 前のレッスンが完了したあとのプロジェクトの状態を反映したソースコードをダウンロードするには、ここ をクリックします。
Oracle データベースユーザー: 前のレッスンが完了したあとのプロジェクトの状態を反映したソースコードをダウンロードするには、ここ をクリックします。
作成時にセッションにウィッシャーの ID を保存
セッション は、HTML 入力フォーム を使用せずに、あるページから別のページへ情報を転送する持続的記憶領域です。この機能は、事前定義された PHP 配列 $_SESSION によってサポートされています。
セキュリティーのために、新しいウィッシャーが作成されたら、フォームに入力せずに自動的にログオンすることをお勧めします。そのため、createNewWisher.php ファイルを変更して、次の機能を実装する必要があります。
データベースに新規ウィッシャーを追加する。
セッションを開く.
ウィッシャーの名前をセッションに保存する
ウィッシャーが editWishList.php ページにリダイレクトされたときに、セッションのウィッシャーの名前を転送する
createNewWisher.php ファイル内で、次の行を検索します。
WishDB::getInstance()->create_wisher($_POST["user"], $_POST["password"]);
そのすぐ下に、次のコードブロックを入力します。
session_start();
$_SESSION['user'] = $_POST['user'];
コードブロックがセッションを開始します。これは、データを入力または取得するための
$_SESSION 配列を開くことを意味します。そのあと、コードは
$_SESSION 配列に要素を追加します。追加された要素には、値と識別子 (キー) が含まれています。値は、新しく作成されたウィッシャーの名前で、識別子は「user」です。そのあと、プログラムはウィッシャーを
editWishList.php ページにリダイレクトします。
ユーザーログオンの検査
ユーザーが editWishList.php ページに到達すると、アプリケーションは、createNewWisher.php ページで登録されたのと同じ人がページにアクセスしていることを確認します。
この機能の実装は、次の 2 つの手順で構成されています。
セッションからのウィッシャーの名前の取得
editWishList.php の PHP ブロックのデフォルトコードを次に置き換えます。
session_start();
if (array_key_exists("user", $_SESSION)) {
echo "Hello " . $_SESSION['user'];
}
コードブロックは、データを取得するための $_SESSION 配列を開き、$_SESSION に識別子「user」を持つ要素が含まれていることを検査します。確認が成功すると、コードは Welcome メッセージを出力します。
セッションが正しく実装されていることを確認するには、次の手順に従います。
createNewWisher.php ファイルを実行し、Jack などの新しいウィッシャーを作成します。
editWishList.php が開き、Hello Jack が表示されます。
ブラウザのセッション cookie を削除するか、セッションを終了して、IDE から editWishList.php を実行します。
editWishList.php ファイルが開き、Hello が表示されます。これは、セッションを介して転送されたユーザーがいないためです。これは、未ログインおよび未登録のユーザーによるウィッシュリストの作成と編集が有効になるため、正しくありません。これを回避するには、ユーザーが index.php ページにリダイレクトされる必要があります。
ログインしていないユーザーのリダイレクト
次のコードブロックを
editWishList.php の
if 節の下に追加します。
else {
header('Location: index.php');
exit;
}
コードはユーザーを index.php ページにリダイレクトし、PHP コードの実行を取り消します。
機能が正しく実装されたことを確認するには、
editWishList.php ファイルを実行します。期待する結果は、
index.php ページが開くことです。
index.php ページからのログイン
index.php ページからのログオンは、次の 2 つの手順で構成されています。
index.php 上のログオン用の HTML フォーム
index.php ファイルで、次のコードを終了
</body> タグの前に入力します。
<form name="logon" action="index.php" method="POST" >
Username: <input type="text" name="user"/>
Password <input type="password" name="userpassword"/>
<input type="submit" value="Edit My Wish List"/>
</form>
注: HTML バリデータからの警告は無視してかまいません。
コードは、テキストフィールドにユーザーの名前とパスワードを入力できる
HTML フォーム を示します。ユーザーが「Edit My Wish List」をクリックすると、データが同じページ index.php に転送されます。
ログオンの検査
ログオンの検査には、次が含まれます。
ユーザーは、アプリケーションの開始時、editWishList.php ページから、または名前とパスワードの入力後に index.php ページからリダイレクトされたときに、index.php ページにアクセスすることがあります。
最後のケースのみ HTML 要求メソッド の POST が使用されるため、ユーザーが index.php にアクセスするときに、そのユーザーがどこにいたのかを常に確認することができます。
index.php ファイルで、<?php ?> ブロックを HTML ブロックの上に作成し、次のコードを入力します。
<?php
require_once("Includes/db.php");
$logonSuccess = false;
// verify user's credentials
if ($_SERVER['REQUEST_METHOD'] == "POST") {
$logonSuccess = (WishDB::getInstance()->verify_wisher_credentials($_POST['user'], $_POST['userpassword']));
if ($logonSuccess == true) {
session_start();
$_SESSION['user'] = $_POST['user'];
header('Location: editWishList.php');
exit;
}
}
?>
コードブロックの先頭部分は、db.php ファイルの使用を有効にし、$logonSuccess 変数を値 false で初期化します。検査が成功すると、この値は true に変更されます。
ユーザーの資格を確認するコードは、要求メソッドが POST かどうかをまず確認します。要求メソッドが POST の場合、ユーザーはログオンフォーム を送信したあとでリダイレクトされています。この場合、コードブロックは、ログオンフォームに入力された名前とパスワードを使用して verify_wisher_credentials 関数を呼び出します。
verify_wisher_credentials 関数は、次の節 で作成しますが、ログオンフォーム で送信されたユーザー名とパスワードの値に一致するレコードが wishers 表に存在するかどうかを確認します。verify_wisher_credentials 関数が true を返した場合は、指定された名前とパスワードの組み合わせを持つウィッシャーがデータベースに登録されています。これは、検査が成功し、$logonSuccess の値が true に変更されることを意味します。この場合は、セッションが開始し、$_SESSION 配列が開きます。コードは $_SESSION 配列に新しい要素を追加します。この要素には、値と識別子 (キー) が含まれています。値はウィッシャーの名前で、識別子は「user」です。次に、コードは、ウィッシュリストを編集するためにユーザーを editWishList.php ページにリダイレクトします。
verify_wisher_credentials 関数が false を返した場合、$logonSuccess 変数の値は false のままです。変数の値は、エラーメッセージの表示 で使用されます。
関数 verify_wisher_credentials
ウィッシャーの証明書の検査を実装するためには、db.php ファイルの WishDB クラスに新しい関数を追加する必要があります。この関数は、入力パラメータとして名前とパスワードを必要とし、0 または 1 を返します。
MySQL データベースの場合は 、次のコードブロックを入力します。
public function verify_wisher_credentials ($name, $password){ $name = $this->real_escape_string($name);
$password = $this->real_escape_string($password); $result = $this->query("SELECT 1 FROM wishers
WHERE name = '" . $name . "' AND password = '" . $password . "'");
return $result->data_seek(0);
}
Oracle データベースの場合は 、次のコードブロックを入力します (OCI8 には mysql_num_rows に相当するものがないため、このコードは get_wisher_id_by_name の変形です)。
public function verify_wisher_credentials($name, $password) {
$query = "SELECT 1 FROM wishers WHERE name = :name_bv AND password = :pwd_bv";
$stid = oci_parse($this->con, $query);
oci_bind_by_name($stid, ':name_bv', $name);
oci_bind_by_name($stid, ':pwd_bv', $password);
oci_execute($stid);
//Because name is a unique value I only expect one row
$row = oci_fetch_array($stid, OCI_ASSOC);
if ($row)
return true;
else
return false;
}
コードブロックは、クエリー "SELECT 1 FROM wishers WHERE Name = '" . $name . "' AND Password = '" . $password . "'" を実行し、指定したクエリーに一致するレコードの数を返します。そのようなレコードが見つかった場合、この関数は true を返します。そのようなレコードがデータベースにない場合、この関数は false を返します。
エラーメッセージの表示
アプリケーションがエラーメッセージを表示できるようにするには、次の <? php ?> コードブロックを
index.php のログオンフォームの入力フィールドより下、ボタンより上に入力します。
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (!$logonSuccess)
echo "Invalid name and/or password";
}
?>
コードブロックは $logonSuccess 変数の値を確認し、false の場合、エラーメッセージを表示します。
index.php ページからのログオンのテスト
index.php の最初のページでログオン機能が正しく動作することを確認するには、次の手順に従います。
アプリケーションを実行します。
index.php ページで、「Username」編集ボックスに「Tom」と入力し、「Password」編集ボックスに「Tim」と入力します。
「Edit My Wish List」をクリックします。次のエラーメッセージが表示されます (次のブラウザウィンドウは 600px 幅に縮小されているため、改行がいくつか追加されています)。
「Username」編集ボックスに「Tom」と入力し、「Password」編集ボックスに「tomcat」と入力します。
「Edit My Wish List」をクリックします。次の editWishList.php ページが表示されます。
現在のレッスン完了後のアプリケーションソースコード
MySQL ユーザー: このレッスンが完了したあとのプロジェクトの状態を反映したソースコードをダウンロードするには、ここ をクリックします。
Oracle データベースユーザー: このレッスンが完了したあとのプロジェクトの状態を反映したソースコードをダウンロードするには、ここ をクリックします。
次の手順
<< 前のレッスン
次のレッスン >>
チュートリアルのメインページに戻る
users
@
php.netbeans.org
メーリングリストに登録する ことによって、NetBeans IDE PHP 開発機能に関するご意見やご提案を送信したり、サポートを受けたり、最新の開発情報を入手したりできます。
PHP の学習に戻る