php网站内容管理系统(PHP中的密码哈希存储密码存储密码的配套)
优采云 发布时间: 2022-01-20 10:11php网站内容管理系统(PHP中的密码哈希存储密码存储密码的配套)
前言
自撰写本文以来的这些年里,许多黑客都瞄准了受密码保护的 网站s。客户密码的存储一直是许多讨论的主题,其中一些很有用,而另一些则被误导了。当然,没有人会以明文形式存储客户端密码,但许多尝试的解决方案(消息摘要、加密等)都比明文略好。可以在此处找到密码存储的伴侣文章:PHP 中的密码散列。以下讨论和 文章 部分“后记:关于存储密码”已过时,不应用作您的应用程序的基础。
介绍
新 PHP 开发人员的一个常见设计模式问题是:“如何处理客户端注册和登录?” 它在每个框架和 cms 中都完成,它们都使用相似的模式。本文将逐步构建模式,以便您可以看到代码的每个部分发生了什么。
对于此示例,我们依靠 PHP 会话处理程序来告诉我们客户端是否已登录。我们还使用 cookie 来“记住”客户端已登录,并且我们使用收录客户端信息的数据库表。
我们对这种设计模式的实现使我们能够使用一行 PHP 代码对网页进行密码保护,如下所示:
access_control();
此外,我们可以使用以下方法测试客户端登录(实际上不需要登录):
if (access_control(TRUE)) { /* CLIENT IS ALREADY LOGGED IN */ }
本文末尾有一些注释和后记。如果您有时间,您可能需要向下滚动并立即阅读。他们更深入地探讨了您在尝试此设计时可能遇到的问题。然后回来继续。
公约和标准
1.我们同意在所有页面上使用 session_start() 的约定,没有例外。您可能希望将 session_start() 添加到一个通用脚本的顶部,该脚本收录在所有页面脚本的顶部,以便 网站 的每个页面都可以像这样开始:
PLEASE REGISTER
CHOOSE USERNAME:
CHOOSE PASSWORD:
VERIFY PASSWORD:
KEEP ME LOGGED IN (DO NOT CHECK THIS ON A PUBLIC COMPUTER)
客户端验证 - 登录页面
现在我们可以注册用户,并且我们有一个可以让我们看到实际注册的测试页面,我们需要创建登录和注销页面。
登录页面使用类似于注册页面的结构。我们需要我们的配置页面,然后测试是否提供了必要的凭据(第 5 行)。我们过滤和清理外部输入(第 8-9 行),然后查询数据库以在 UID 和 PWD 字段中找到精确匹配(第 12-20 行)。如果在 UID 和 PWD 上都没有找到匹配的行,第 20 行的 if() 语句将失败,脚本将下降到第 46 行,在这里我们可以告诉客户端身份验证失败,并且可以再次显示登录名表单。如果确实找到了您要查找的行,则将其检索(第 23 行)并将 UID 值复制到会话数组中(第 26 行)以显示客户端现在已登录。我们的下一步是查看是否客户检查了“记住我”框。我们测试复选框(第 29 行),如果它被选中,我们调用 Remember_me() 函数,传递注册时创建的唯一用户密钥。Remember_me() 函数在浏览器上设置一个长期存在的 cookie。没有这个 cookie,只有会话 cookie 用于记住客户端。会话 cookie 也会在浏览器窗口关闭时过期。
登录过程的最后一步是确定客户端下一步要去哪里。我们通过测试会话数组中的“entry_uri”来做到这一点。如果它是由配置脚本中的 access_control() 函数设置的,我们可以在 header() 命令中使用该地址将客户端带回原创页面。如果未设置该选项(如果客户端直接进入登录页面会发生这种情况),我们可以重定向到主页。
也许它应该不言而喻,但我还是要说:不要在你的登录脚本中放置 access_control() 函数,否则你的代码可能会导致服务器循环!这是登录脚本:
PLEASE LOG IN
UID:
PWD:
KEEP ME LOGGED IN (DO NOT CHECK THIS ON A PUBLIC COMPUTER)
客户端取消身份验证 - 退出页面
如果我们的客户端已登录,并且没有选中“记住我”框,那么当浏览器窗口关闭或会话垃圾采集例程检测到长时间不活动时,他将自动注销。(通常约 24 分钟)。但是,我们的客户可能希望故意退出,或者出于对公共计算机的极大谨慎考虑。因此,我们还必须提供如下所示的注销脚本。
与往常一样,我们的第一步是加载“config”脚本。接下来,我们从会话数组中采集 UID,或者设置一个替代值。我们将在“再见”消息中使用它,因此即使客户端连续两次登录注销脚本,或者在客户端未登录时以某种方式设法到达那里,我们也会尝试选择一个有意义的data String 这在三元运算符语句(第 5 行)中完成。
我们会处理“记住我”cookie(如果有)(第 7-12 行)。
下一步是清除会话数组(第 15 行)。这可能看起来势不可挡,您可能会考虑完全消除会话是否有意义。如果即使在客户端注销后会话中仍有其他信息要保留,您可以在第 15 行取消设置 ($_SESSION["uid"]) 并跳过其余代码。但是,您永远不应该使用 unset($_SESSION) 来清除数组。请参阅此处的注释:
ession.examples.basic.php
最后,您可以使用我们在第 5 行创建的数据字符串说“再见”。浏览器输出,而不是激活标题(“位置:/”
看看“出口”;最后一行的声明。虽然这里没有严格要求,但在标题(“位置”)声明之后使用“退出”是一个好习惯。为什么?因为在发送 header() 后,您的脚本将继续正常运行,并且将运行不可预测的时间 - 直到浏览器接收到 header 并通过重定向停止脚本。有很多适当的 header() 语句可以内联用作完整脚本的一部分,但是当您使用旨在成为脚本中最后一个语句的语句时,您需要采取额外的步骤来确保它是,实际上,执行的最后一条语句。这是注销脚本:
CHANGE YOUR PASSWORD
FORMER PASSWORD:
CHOOSE PASSWORD:
VERIFY PASSWORD:
简介——付诸实践
这就是使用基本 PHP 身份验证对网页进行密码保护的全部内容。一旦这种结构到位,就可以显示公共注册和登录页面,并且可以使用公共、受保护和部分受保护的网页组合构建站点。最重要的是,您可以使用一行 PHP 代码执行身份验证测试。这些脚本使用 PHP 会话来识别登录的客户端。客户可以要求您的 网站 记住他们的状态,您可以帮助他们。他们可以随时注销,也可以在一段时间不活动后自动注销。他们可以随时更改密码以保护其帐户信息。
此处的注释和代码在大多数 PHP 安装中都可以正常工作,但它们仅用作说明性示例,并不打算在生产环境中“按原样”使用 - 因此请随意复制和修改它们以满足您的特定需求.
后记:了解 PHP 会话
虽然这些脚本以合理的方式使用 PHP 会话,但我发现很容易过度思考 PHP 会话的工作方式。它们比您预期的要容易得多!您可能想阅读这两篇 文章 文章,以更好地了解我们的 PHP 客户端身份验证所依赖的底层技术。
文章 关于 PHP 会话。