blob: aef83d050c0b2a459d606ea65204a5b9f6b5f37c [file] [log] [blame]
//
// 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,Сохранение идентификатора пользователя в сеансе после создания пользователя>>
2. <<_validating_user_logon,Проверка того, что пользователь, предпринимающий попытки редактирования списка "Wish list", зарегистрирован в системе.>>
3. <<_html_form_for_logon_on_index_php,Регистрация пользователя на странице index.php >>
Текущий документ является частью краткого учебного курса "Создание приложения CRUD в IDE NetBeans для 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]]
== Сохранение идентификатора пользователя в сеансе после создания пользователя
link:http://us2.php.net/manual/en/ref.session.php[+Session+] ("Сеанс") является хранилищем состояния для передачи информации с одной страницы на другую без использования link:wish-list-lesson5.html#htmlForm[+формы ввода HTML+]. Данная функция поддерживается посредством предопределенного массива PHР `$_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` .
Реализация этих функциональных возможностей состоит из двух действий:
* <<_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]]
=== Извлечение имени пользователя из сеанса
Замените код, содержащийся в блоке PHP по умолчанию, `editWishList.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 сеанса в используемом браузере, либо завершить сеанс и запустить файл `editWishList.php` в среде IDE.
Откроется файл `editWishList.php` , содержащий текст "Hello", поскольку в рамках сеанса не были переданы какие-либо данные пользователя. Это нежелательный вариант, так как в данном случае незарегистрированный или не выполнивший вход в систему пользователь может создавать или редактировать список "Wish list". Во избежание этого следует выполнить переадресацию пользователя на страницу `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 состоит из двух действий:
* <<logonForm,Ввод имени пользователя и пароля в форму ввода HTML и передача данных на страницу index.php для проверки достоверности.>>
* <<_logon_validation,Проверка допустимости входа>>
[[_html_form_for_logon_on_index_php]]
=== Форма HTML для входа на странице index.php
В файле `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,Проверка местоположения пользователя до переадресации>>.
* <<_logon_validation,Проверка имени пользователя и пароля>>.
* Сохранение имени пользователя в сеансе и переадресация пользователя на страницу editWishList.php или <<_logon_validation,Отображение сообщения об ошибке.>>
Пользователь может выполнить доступ на страницу `index.php` при запуске приложения, с помощью страницы <<_function_verify_wisher_credentials, editWishList.php>> или при переадресации со страницы `index.php` после ввода имени и пароля.
Поскольку только в последнем случае используется link:http://www.htmlcodetutorial.com/forms/_FORM_METHOD.html[+метод запроса HTML+] POST, существует возможность узнать местонахождение пользователя, если он выполняет доступ к странице `index.php` .
В файле index.php над блоком HTML создайте блок <? php? > со следующим кодом:
[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` , используя имя и пароль, введенные в форме входа.
Функция `verify_wisher_credentials` , которую мы напишем в <<_function_verify_wisher_credentials,следующем разделе>>, проверяет есть ли запись в таблице `пользователей` , где имя пользователя и пароль совпадают со значениями, поданными в <<_html_form_for_logon_on_index_php,форме входа>>. Если функция `verify_wisher_credentials` возвращает `true` , то в базе данных есть пользователь с указанной комбинацией имени и пароля. Это значит, что проверка успешна и значение `$logonSuccess` меняется на `true` . В таком случае начинается сеанс и открывается массив `$_SESSION` . Код добавляет новый элемент к массиву `$_SESSION` . Этот элемент содержит значение и идентификатор (ключ). Значение является именем пользователя, а идентификатором является "user". Затем код перенаправляет пользователя к странице `editWishList.php` для редактирования списка желаний.
Если функция `verify_wisher_credentials` возвращает `false` , то значением переменной `$logonSuccess` останется false. Значение переменной используется для <<displayErrorMessage,отображения сообщения об ошибке>>.
[[_function_verify_wisher_credentials]]
=== Функция verify_wisher_credentials
Для проверки учетных данных пользователя необходимо добавить новую функцию к классу `WishDB` в файле `db.php` . Входными параметрами для этой функции являются имя и пароль; функция возвращает значение 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]]
=== Отображение сообщений об ошибках
Для включения отображения сообщений об ошибках в приложении введите следующий блок кода <? php ? > в форму "logon" на странице `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` введите "Tom" в поле "Username" и "Tim" в поле "Password".
3. Нажмите кнопку "Edit My Wish List". Отобразится сообщение об ошибке (обратите внимание, что ширина приведенного ниже окна браузера уменьшена до 600 пикселей, в результате чего добавляется несколько разрывов строк).
image::images/incorrectNamePasswordIndex.png[]
[start=4]
. Введите "Tom" в поле "Username" и "tomcat" в поле "Password".
[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 Database: щелкните 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[+Отправить отзыв по этому учебному курсу+]
Для отправки комментариев и предложений, получения поддержки и новостей о последних разработках, связанных с PHP IDE NetBeans link:../../../community/lists/top.html[+присоединяйтесь к списку рассылки users@php.netbeans.org+].
link:../../trails/php.html[+Возврат к учебной карте PHP+]