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

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

このページの内容は、NetBeans IDE 7.2、7.3、7.4および8.0に適用されます

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

  • index.php
  • createNewWisher.php
  • editWishlist.php
  • db.php
ログオン機能の実装は、次の手順で構成されています。
  1. ウィッシャの作成時に、セッションにウィッシャのIDを保存する
  2. ウィッシュ・リストを編集しようとするユーザーがログインしていることを検証する
  3. index.phpページからウィッシャがログオンする

現在のドキュメントは、PHP向けのNetBeans IDEでのCRUDアプリケーションの作成というPHPチュートリアルの一部です。


前のレッスンからのアプリケーション・ソース・コード

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」を持つ要素が含まれていることを確認します。確認が成功すると、コードは開始メッセージを出力します。

セッションが正しく実装されていることを確認するには:
  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;

// 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を返します。

エラー・メッセージの表示

アプリケーションがエラー・メッセージを表示できるようにするには、次の<? >コード・ブロックを、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の学習に戻る

get support for the NetBeans

Support


By use of this website, you agree to the NetBeans Policies and Terms of Use. © 2013, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo