Создание приложения на основе базы данных на языке PHP

Урок 5: добавление функций безопасности Реализация входа пользователя в приложения

Содержимое на этой странице применимо к IDE NetBeans 7.2, 7.3, 7.4 и 8.0

В этом уроке рассматривается реализация функциональных возможностей входа в приложение для пользователя. Эти функции применимы к следующим файлам:

  • index.php
  • createNewWisher.php
  • editWishlist.php
  • db.php
Реализация функции входа в систему состоит из следующих действий:
  1. Сохранение идентификатора пользователя в сеансе после создания пользователя
  2. Проверка того, что пользователь, предпринимающий попытки редактирования списка "Wish list", зарегистрирован в системе.
  3. Регистрация пользователя на странице index.php

Текущий документ является частью краткого учебного курса "Создание приложения CRUD в IDE NetBeans для PHP".


Исходный код приложения из предыдущего урока

Для пользователей MySQL: перейдите по этой ссылке для загрузки исходного кода, описывающего состояние проекта на момент завершения предыдущего урока.

Для пользователей баз данных Oracle: перейдите по этой для загрузки исходного кода, описывающего состояние проекта на момент завершения предыдущего урока.

Сохранение идентификатора пользователя в сеансе после создания пользователя

Session ("Сеанс") является хранилищем состояния для передачи информации с одной страницы на другую без использования формы ввода HTML. Данная функция поддерживается посредством предопределенного массива PHР $_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.

Реализация этих функциональных возможностей состоит из двух действий:

Извлечение имени пользователя из сеанса

Замените код, содержащийся в блоке PHP по умолчанию, editWishList.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 сеанса в используемом браузере, либо завершить сеанс и запустить файл editWishList.php в среде IDE.
    Откроется файл editWishList.php, содержащий текст "Hello", поскольку в рамках сеанса не были переданы какие-либо данные пользователя. Это нежелательный вариант, так как в данном случае незарегистрированный или не выполнивший вход в систему пользователь может создавать или редактировать список "Wish list". Во избежание этого следует выполнить переадресацию пользователя на страницу index.php.

Переадресация пользователя, не зарегистрированного в системе

Разместите следующий блок кода в файле editWishList.php под выражением if:
else {
   header('Location: index.php');
   exit;
}

В соответствии с кодом осуществляется переадресация пользователя на страницу index.php и прерывается выполнение кода PHP.

Для проверки того, что функциональные возможности реализованы правильно, запустите файл editWishList.php. Ожидаемым результатом является открытие страницы index.php.

Регистрация на странице index.php

Вход с использованием страницы index.php состоит из двух действий:

Форма HTML для входа на странице index.php

В файле 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.

Проверка допустимости входа

Проверка допустимости входа включает следующие действия:

Пользователь может выполнить доступ на страницу index.php при запуске приложения, с помощью страницы editWishList.php или при переадресации со страницы index.php после ввода имени и пароля.

Поскольку только в последнем случае используется метод запроса HTML POST, существует возможность узнать местонахождение пользователя, если он выполняет доступ к странице index.php.

В файле index.php над блоком HTML создайте блок <? 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 является методом запроса, то пользователь был перенаправлен после подачи формы входа. В таком случае блок кода вызывает функцию verify_wisher_credentials, используя имя и пароль, введенные в форме входа.

Функция verify_wisher_credentials, которую мы напишем в следующем разделе, проверяет есть ли запись в таблице пользователей, где имя пользователя и пароль совпадают со значениями, поданными в форме входа. Если функция verify_wisher_credentials возвращает true, то в базе данных есть пользователь с указанной комбинацией имени и пароля. Это значит, что проверка успешна и значение $logonSuccess меняется на true. В таком случае начинается сеанс и открывается массив $_SESSION. Код добавляет новый элемент к массиву $_SESSION. Этот элемент содержит значение и идентификатор (ключ). Значение является именем пользователя, а идентификатором является "user". Затем код перенаправляет пользователя к странице editWishList.php для редактирования списка желаний.

Если функция verify_wisher_credentials возвращает false, то значением переменной $logonSuccess останется false. Значение переменной используется для отображения сообщения об ошибке.

Функция verify_wisher_credentials

Для проверки учетных данных пользователя необходимо добавить новую функцию к классу WishDB в файле db.php. Входными параметрами для этой функции являются имя и пароль; функция возвращает значение 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 ? > в форму "logon" на странице 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 введите "Tom" в поле "Username" и "Tim" в поле "Password".
  3. Нажмите кнопку "Edit My Wish List". Отобразится сообщение об ошибке (обратите внимание, что ширина приведенного ниже окна браузера уменьшена до 600 пикселей, в результате чего добавляется несколько разрывов строк).
    На странице index.php отображается сообщение об ошибке: 'Недопустимое имя пользователя и/или пароль'
  4. Введите "Tom" в поле "Username" и "tomcat" в поле "Password".
  5. Нажмите кнопку Edit My Wish List ("Редактировать мой список желаний"). Отобразится страница editWishList.php:
    index.php: успешный вход

Исходный код приложения на момент завершения текущего урока

Для пользователей MySQL: щелкните здесь для загрузки исходного кода, отражающего состояние проекта по завершении данного урока.

Для пользователей Oracle Database: щелкните здесь для загрузки исходного кода, отражающего состояние проекта по завершении данного урока.

Что дальше?

<<Предыдущий урок

Следующий урок >>

Назад на главную страницу руководства



Для отправки комментариев и предложений, получения поддержки и новостей о последних разработках, связанных с PHP IDE NetBeans присоединяйтесь к списку рассылки .

Возврат к учебной карте 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