第 5 课:添加安全功能,实现应用程序用户登录

来源:转载

在本课中,将为许愿者实现登录功能。这会影响以下文件:

  • index.php
  • createNewWisher.php
  • editWishlist.php
  • db.php

实现登录功能包括以下步骤:

  1. 在创建许愿者后,在会话中保存许愿者 ID
  2. 验证尝试编辑心愿列表的用户是否登录
  3. 许愿者从 index.php 页中登录

当前文档是“在适用于 PHP 的 NetBeans IDE 中创建 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 页上注册的同一个人访问了该页。

实现该功能包括两个步骤:

  • 从会话中检索许愿者的名字
  • 如果从会话中检索许愿者名字失败,将用户重定向到 index.php

从会话中检索许愿者的名字

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.php 中,在 if子句下面添加以下代码块:
else { header('Location: index.php'); exit;}

该代码将用户重定向到 index.php 页并取消 PHP 代码执行。

要检查是否正确实现了该功能,请运行 editWishList.php 文件。预期的结果是打开 index.php 页。

从 index.php 页中登录

从 index.php 页中登录包括两个步骤:

  • 在 HTML 输入表单中输入用户的名字和口令,并将用于验证的数据提交到 index.php 页
  • 验证登录

用于在 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 页,从 editWishList.php 页中进行访问,或者在输入名字和口令后从 index.php 页中重定向时访问该页。

由于仅在最后一种情况下使用 HTML 请求方法 POST,因此,您始终可以了解用户访问 index.php 时所在的位置。

在 index.php 文件中,使用以下代码在 HTML 块上面创建一个 <?php ?> 块:
<?phprequire_once("Includes/db.php");$logonSuccess = false;

// verify user's credentialsif ($_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 文件,并使用 false 值初始化 $logonSuccess 变量。如果验证成功,该值将变为 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 ?> 代码块(在输入字段下面,但在按钮上面):

<?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 而添加了一些换行符):
  4. 在 "Username" 编辑框中输入 Tom,在 "Password" 编辑框中输入 tomcat。
  5. 按 "Edit My Wish List"。将显示 editWishList.php 页:

完成当前课程后的应用程序源代码

MySQL 用户:单击此处以下载源代码,该代码反映了在完成课程后的项目状态。

Oracle 数据库用户:单击此处以下载源代码,该代码反映了在完成课程后的项目状态。


分享给朋友:
您可能感兴趣的文章:
随机阅读: