| // |
| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| // |
| |
| = PHPを使用するデータベース駆動型アプリケーションの作成 |
| :jbake-type: tutorial |
| :jbake-tags: tutorials |
| :jbake-status: published |
| :icons: font |
| :syntax: true |
| :source-highlighter: pygments |
| :toc: left |
| :toc-title: |
| :description: PHPを使用するデータベース駆動型アプリケーションの作成 - Apache NetBeans |
| :keywords: Apache NetBeans, Tutorials, PHPを使用するデータベース駆動型アプリケーションの作成 |
| |
| = レッスン5: セキュリティの追加。アプリケーション・ユーザー・ログオンの実装 |
| :jbake-type: tutorial |
| :jbake-tags: tutorials |
| :jbake-status: published |
| :icons: font |
| :syntax: true |
| :source-highlighter: pygments |
| :toc: left |
| :toc-title: |
| :description: レッスン5: セキュリティの追加。アプリケーション・ユーザー・ログオンの実装 - Apache NetBeans |
| :keywords: Apache NetBeans, Tutorials, レッスン5: セキュリティの追加。アプリケーション・ユーザー・ログオンの実装 |
| |
| |
| このレッスンでは、ウィッシャ用のログオン機能を実装します。これは次のファイルに影響します。 |
| |
| * `index.php` |
| * `createNewWisher.php` |
| * `editWishlist.php` |
| * `db.php` |
| |
| ログオン機能の実装は、次の手順で構成されています。 |
| |
| 1. <<_saving_the_wisher_s_id_in_the_session_upon_creation,ウィッシャの作成時に、セッションにウィッシャのIDを保存する>> |
| 2. <<_validating_user_logon,ウィッシュ・リストを編集しようとするユーザーがログインしていることを検証する>> |
| 3. <<_html_form_for_logon_on_index_php,index.phpページからウィッシャがログオンする>> |
| |
| 現在のドキュメントは、PHP向けのNetBeans IDEでのCRUDアプリケーションの作成というPHPチュートリアルの一部です。 |
| |
| |
| [[_application_source_code_from_the_previous_lesson]] |
| == 前のレッスンからのアプリケーション・ソース・コード |
| |
| MySQLユーザー: 前のレッスンが完了した後のプロジェクトの状態を反映したソース・コードをダウンロードするには、link:https://netbeans.org/files/documents/4/1930/lesson4.zip[+ここ+]をクリックします。 |
| |
| Oracleデータベース・ユーザー: 前のレッスンが完了した後のプロジェクトの状態を反映したソース・コードをダウンロードするには、link:https://netbeans.org/projects/www/downloads/download/php%252Foracle-lesson4.zip[+ここ+]をクリックします。 |
| |
| [[_saving_the_wisher_s_id_in_the_session_upon_creation]] |
| == 作成時にセッションにウィッシャのIDを保存 |
| |
| link:http://us2.php.net/manual/en/ref.session.php[+セッション+]は、link:wish-list-lesson5.html#_html_form_for_logon_on_index_php[+HTML入力フォーム+]を使用せずに、あるページから別のページへ情報を転送する持続的記憶域です。この機能は、事前定義されたPHP配列 `$_SESSION` によってサポートされています。 |
| |
| セキュリティのために、新しいウィッシャが作成されたら、フォームに入力せずに自動的にログオンする必要があります。そのため、 `createNewWisher.php` ファイルを変更して、次の機能を実装する必要があります。 |
| |
| * データベースに新規ウィッシャを追加する。 |
| * セッションを開く。 |
| * ウィッシャの名前をセッションに保存する。 |
| * ウィッシャが `editWishList.php` ページにリダイレクトされたときに、セッションのウィッシャの名前を転送する。 |
| |
| `createNewWisher.php` ファイル内で、次の行を検索します。 |
| |
| |
| [source,php] |
| ---- |
| |
| WishDB::getInstance()->create_wisher($_POST['user'], $_POST['password']); |
| ---- |
| |
| そのすぐ下に、次のコード・ブロックを入力します。 |
| |
| |
| [source,php] |
| ---- |
| |
| session_start(); |
| $_SESSION['user'] = $_POST['user']; |
| ---- |
| |
| このコード・ブロックはセッションを開始し、これは、データを入力または取得するための `$_SESSION` 配列を開くことを意味します。その後、コードは `$_SESSION` 配列に要素を追加します。追加された要素には、値と識別子(キー)が含まれています。値は、新しく作成されたウィッシャの名前で、識別子は「user」です。その後、プログラムはウィッシャを `editWishList.php` ページにリダイレクトします。 |
| |
| [[_validating_user_logon]] |
| == ユーザー・ログオンの検証 |
| |
| ユーザーが `editWishList.php` ページに到達すると、アプリケーションは、 `createNewWisher.php` ページで登録されたのと同じユーザーがページにアクセスしていることを確認する必要があります。 |
| |
| この機能の実装は、次の2つのステップで構成されます。 |
| |
| * <<_retrieving_the_wisher_s_name_from_the_session,セッションからのウィッシャの名前の取得>> |
| * <<_logging_in_from_the_index_php_page,セッションからのウィッシャの名前の取得に失敗した場合にユーザーをindex.phpにリダイレクトする>> |
| |
| [[_retrieving_the_wisher_s_name_from_the_session]] |
| === セッションからのウィッシャの名前の取得 |
| |
| `editWishList.php` のPHPブロックのデフォルト・コードを次に置き換えます。 |
| |
| [source,php] |
| ---- |
| |
| session_start(); |
| if (array_key_exists("user", $_SESSION)) { |
| echo "Hello " . $_SESSION['user']; |
| } |
| ---- |
| |
| このコード・ブロックは、データを取得するための `$_SESSION` 配列を開き、 `$_SESSION` に識別子「user」を持つ要素が含まれていることを確認します。確認が成功すると、コードは開始メッセージを出力します。 |
| |
| セッションが正しく実装されていることを確認するには: |
| |
| 1. `createNewWisher.php` ファイルを実行し、Jackなどの新しいウィッシャを作成します。 |
| `editWishList.php` が開き、「Hello Jack」と表示されます。 |
| |
| [start=2] |
| . ブラウザのセッションCookieをクリアするか、またはセッションを終了して、IDEから `editWishList.php` を実行します。セッションを介して転送されたユーザーがいないため、 |
| `editWishList.php` ファイルが開き、「Hello」と表示されます。これは、未ログインおよび未登録のユーザーがウィッシュ・リストを作成したり編集できるようになるため、正しくありません。これを回避するには、ユーザーが `index.php` ページにリダイレクトされる必要があります。 |
| |
| [[_logging_in_from_the_index_php_page]] |
| === ログインしていないユーザーのリダイレクト |
| |
| 次のコード・ブロックを `editWishList.php` の `if` 節の下に追加します。 |
| |
| [source,php] |
| ---- |
| |
| else { |
| header('Location: index.php'); |
| exit; |
| } |
| ---- |
| |
| このコードは、ユーザーをindex.phpページにリダイレクトし、PHPコードの実行を取り消します。 |
| |
| 機能が正しく実装されたことを確認するには、 `editWishList.php` ファイルを実行します。 `index.php` ページが開く場合は正常です。 |
| |
| [[_html_form_for_logon_on_index_php]] |
| == index.phpページからのログイン |
| |
| index.phpページからのログオンは、次の2つのステップで構成されます。 |
| |
| * <<_html_form_for_logon_on_index_php,ユーザーの名前とパスワードをHTML入力フォームに入力し、検証のためにデータをindex.phpページに送信する>> |
| * <<_logon_validation,ログオンを検証する>> |
| |
| [[_html_form_for_logon_on_index_php]] |
| === index.php上のログオン用のHTMLフォーム |
| |
| `index.php` ファイルで、次のコードを終了 `</body>` タグの前に入力します。 |
| |
| [source,xml] |
| ---- |
| |
| <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バリデータからの警告は無視できます。 |
| |
| このコードは、テキスト・フィールドにユーザーの名前とパスワードを入力できるlink:wish-list-lesson3.html#htmlForm[+HTMLフォーム+]を示します。ユーザーが「Edit My Wish List」をクリックすると、データが同じindex.phpページに転送されます。 |
| |
| |
| === ログオンの検証 |
| |
| ログオンの検証には、次が含まれます。 |
| |
| * <<_logon_validation,ユーザーのリダイレクト元を確認する>>。 |
| * <<_logon_validation,ユーザーの名前とパスワードを確認する>>。 |
| * ユーザー名をセッションに保存して、ユーザーをeditWishList.phpページにリダイレクトするか、または<<_logon_validation,エラー・メッセージを表示する>>。 |
| |
| ユーザーは、アプリケーションの開始時、 `editWishList.php` ページから、または名前とパスワードの入力後に<<_function_verify_wisher_credentials,index.php>>ページからリダイレクトされたときに、 `index.php` ページにアクセスすることがあります。 |
| |
| 最後のケースのみlink:http://www.htmlcodetutorial.com/forms/_FORM_METHOD.html[+HTMLリクエスト・メソッド+]のPOSTが使用されるため、ユーザーが `index.php` にアクセスしたときに、そのユーザーがどこにいたのかを常に確認することができます。 |
| |
| index.phpファイルで、次のコードを使用して、<?php?>ブロックをHTMLブロックの上に作成します。 |
| |
| [source,php] |
| ---- |
| |
| <?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の場合、ユーザーは<<_html_form_for_logon_on_index_php,ログオン・フォーム>>を送信した後にリダイレクトされます。この場合、コード・ブロックはログオン・フォームに入力された名前とパスワードを使用して `verify_wisher_credentials` 関数をコールします。 |
| |
| <<_function_verify_wisher_credentials,次の項>>で記述する `verify_wisher_credentials` 関数は、<<_html_form_for_logon_on_index_php,ログオン・フォーム>>内で送信された値とユーザーおよびパスワードが一致するレコードが、 `wishers` 表にあるかどうかを確認します。 `verify_wisher_credentials` 関数が `true` を返す場合、指定された名前とパスワードの組合せを持つウィッシャがデータベースに登録されます。これは、検証が成功し、 `$logonSuccess` の値が `true` に変更されることを意味します。この場合、セッションが開始し、 `$_SESSION` 配列が開きます。コードは `$_SESSION` 配列に新しい要素を追加します。この要素には、値と識別子(キー)が含まれています。値はウィッシャの名前で、識別子は「user」です。次に、ウィッシュ・リストを編集するために、コードはユーザーを `editWishList.php` ページにリダイレクトします。 |
| |
| `verify_wisher_credentials` 関数が `false` を返す場合、 `$logonSuccess` 変数の値はfalseのままです。変数の値は、<<_displaying_error_messages,エラー・メッセージの表示>>で使用されます。 |
| |
| [[_function_verify_wisher_credentials]] |
| === 関数verify_wisher_credentials |
| |
| ウィッシャの資格の確認を実装するには、 `db.php` ファイルの `WishDB` クラスに新しい関数を追加する必要があります。この関数は、入力パラメータとして名前とパスワードを必要とし、0または1を返します。 |
| |
| *MySQLデータベースの場合*、次のコード・ブロックを入力します。 |
| |
| [source,php] |
| ---- |
| |
| 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` の変更された形式です)。 |
| |
| |
| [source,php] |
| ---- |
| |
| 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` を返します。 |
| |
| [[_displaying_error_messages]] |
| === エラー・メッセージの表示 |
| |
| アプリケーションがエラー・メッセージを表示できるようにするには、次の<? >コード・ブロックを、 `index.php` のログオン・フォームの入力フィールドより下で、ボタンより上に入力します。 |
| |
| [source,php] |
| ---- |
| |
| <?php |
| if ($_SERVER['REQUEST_METHOD'] == "POST") { |
| if (!$logonSuccess) |
| echo "Invalid name and/or password"; |
| } |
| ?> |
| ---- |
| |
| このコード・ブロックは$logonSuccess変数の値を確認し、falseの場合はエラー・メッセージを表示します。 |
| |
| [[_testing_the_logon_from_the_index_php_page]] |
| == index.phpページからのログオンのテスト |
| |
| `index.php` の最初のページでログオン機能が正しく動作することを確認するには: |
| |
| 1. アプリケーションを実行します。 |
| 2. `index.php` ページで、「Username」編集ボックスに「Tom」と入力し、「Password」編集ボックスに「Tim」と入力します。 |
| 3. 「Edit My Wish List」をクリックします。エラー・メッセージが表示されます(下のブラウザ・ウィンドウは幅が600pxに縮小されているため、改行がいくつか追加されています)。 |
| |
| image::images/incorrectNamePasswordIndex.png[] |
| |
| |
| [start=4] |
| . 「Username」編集ボックスに「Tom」と入力し、「Password」編集ボックスに「tomcat」と入力します。 |
| |
| [start=5] |
| . 「Edit My Wish List」をクリックします。editWishList.phpページが表示されます。 |
| |
| image::images/SuccessfulLogonOnIndexRedirectToEditWishList.png[] |
| |
| [[application_source_code_after_the_current_lesson_is_completed]] |
| == 現在のレッスン完了後のアプリケーション・ソース・コード |
| |
| MySQLユーザー: このレッスンが完了した後のプロジェクトの状態を反映したソース・コードをダウンロードするには、link:https://netbeans.org/files/documents/4/1931/lesson5.zip[+ここ+]をクリックします。 |
| |
| Oracleデータベース・ユーザー: このレッスンが完了した後のプロジェクトの状態を反映したソース・コードをダウンロードするには、link:https://netbeans.org/projects/www/downloads/download/php%252Foracle-lesson5.zip[+ここ+]をクリックします。 |
| |
| [[_next_steps]] |
| == 次の手順 |
| |
| link:wish-list-lesson4.html[+<< 前のレッスン+] |
| |
| link:wish-list-lesson6.html[+次のレッスン>>+] |
| |
| link:wish-list-tutorial-main-page.html[+チュートリアルのメイン・ページに戻る+] |
| |
| |
| link:/about/contact_form.html?to=3&subject=Feedback:%20PHP%20Wish%20List%20CRUD%205:%20Implementing%20Security[+このチュートリアルに関するご意見をお寄せください+] |
| |
| |
| link:../../../community/lists/top.html[+users@php.netbeans.orgメーリング・リストに登録する+]ことによって、NetBeans IDE PHP開発機能に関するご意見やご提案を送信したり、サポートを受けたり、最新の開発情報を入手したりできます。 |
| |
| link:../../trails/php.html[+PHPの学習に戻る+] |
| |