corner imagecorner image
IDEPlatformPluginsDocs & SupportCommunityPartners

PHP を使用するデータベース駆動型アプリケーションの作成

レッスン 5: セキュリティーの追加。ユーザーログオンアプリケーションの実装

このページの内容は NetBeans IDE 6.9-7.0 が対象です

このレッスンでは、ウィッシャー用のログオン機能を実装します。これは次のファイルに影響します。

  • index.php
  • createNewWisher.php
  • editWishlist.php
  • db.php
ログオン機能の実装は、次の手順で構成されています。
  1. ウィッシャーの作成時に、セッションにウィッシャーの ID を保存する
  2. ウィッシュリストを編集しようとするユーザーがログインしていることを検査する
  3. 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 メッセージを出力します。

セッションが正しく実装されていることを確認するには、次の手順に従います。
  1. createNewWisher.php ファイルを実行し、Jack などの新しいウィッシャーを作成します。
    editWishList.php が開き、Hello Jack が表示されます。
  2. ブラウザのセッション cookie を削除するか、セッションを終了して、IDE から editWishList.php を実行します。
    editWishList.php ファイルが開き、Hello が表示されます。これは、セッションを介して転送されたユーザーがいないためです。これは、未ログインおよび未登録のユーザーによるウィッシュリストの作成と編集が有効になるため、正しくありません。これを回避するには、ユーザーが index.php ページにリダイレクトされる必要があります。

ログインしていないユーザーのリダイレクト

次のコードブロックを editWishList.phpif 節の下に追加します。
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;

// ユーザーの資格を確認する 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 Database の場合、次のコードブロックを入力します (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);
//名前は一意の値であるため 1 行のみが期待される
    $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 の最初のページでログオン機能が正しく動作することを確認するには、次の手順に従います。
  1. アプリケーションを実行します。
  2. index.php ページで、「Username」編集ボックスに「Tom」と入力し、「Password」編集ボックスに「Tim」と入力します。
  3. 「Edit My Wish List」をクリックします。エラーメッセージが表示されます (下のブラウザウィンドウは幅が 600px に縮小されているため、改行がいくつか追加されています)。
    エラーメッセージを表示した index.php ページ: 間違った名前および/またはパスワード
  4. 「Username」編集ボックスに「Tom」と入力し、「Password」編集ボックスに「tomcat」と入力します。
  5. 「Edit My Wish List」をクリックします。editWishList.php ページが表示されます。
    index.php: ログオン成功

現在のレッスン完了後のアプリケーションソースコード

MySQL ユーザー: このレッスンが完了したあとのプロジェクトの状態を反映したソースコードをダウンロードするには、ここをクリックします。

Oracle データベースユーザー: このレッスンが完了したあとのプロジェクトの状態を反映したソースコードをダウンロードするには、ここをクリックします。

次の手順

<< 前のレッスン

次のレッスン >>

チュートリアルのメインページに戻る



メーリングリストに登録することによって、NetBeans IDE PHP 開発機能に関するご意見やご提案を送信したり、サポートを受けたり、最新の開発情報を入手したりできます。

PHP の学習に戻る