【问题标题】:Can I securely store username and password in PHP session variables?我可以在 PHP 会话变量中安全地存储用户名和密码吗?
【发布时间】:2013-11-10 22:16:12
【问题描述】:

我想在 REST api 之上制作一个轻量级 webapp,用户应该只验证一次,从那时起,所有针对 web api 的请求都希望通过以某种方式保持用户名和密码有效来完成。

我已经制作了一个工作原型,如果对 REST api 的第一次请求成功,我会将用户名和密码存储在会话变量中,然后从那时起请求是使用从会话变量中获取的身份验证信息发出的。到目前为止一切顺利。

通过这种方法,我意识到有权访问服务器的人将能够读取密码。在 PHP 中是否有某种方法可以让我遵循我的方法并具有适当的安全性?

更新更多细节:

这里的预期目标是基于使用不同数据查询从 API 检索到的数据,而不是让用户每次尝试都输入他的用户名和密码,从而对数据进行可视化。所以 API 是完全无状态的,但是带有 gui 的 Web 应用程序应该是有状态的。

在这种情况下,我无法控制 Rest API,因此对它的每个请求都需要发送带有基本身份验证的 API 用户名和密码,没有替代方案,例如 API 密钥、会话令牌或类似的东西.这就是为什么只要用户会话持续,我就必须保留用户名和密码,我想知道将它们存储在会话变量中的方法是否被认为是安全的。

【问题讨论】:

  • 这不是违反 REST 的原则吗?
  • 这有点不清楚。您能否更详细地了解在这种情况下客户是谁?您如何登录和查询 API?您将在哪里存储用户名和密码?
  • 我希望从我最初的问题中可以清楚地看出,我正在使用保存在 PHP $_Session 变量中的用户名和密码向 REST Api 发出 HTTP 请求,这样我的用户只需输入一次,但我现在已经用更多信息更新了这个问题。
  • 你的问题还不清楚。为什么每次请求都包含用户名和密码时,必须在会话中存储用户名和密码?
  • 因为我希望用户只需要使用他们的 api 用户名和密码登录我的 webapp 一次。

标签: php security rest


【解决方案1】:

只要您不将会话状态存储在 REST API 服务器上,仅存储在您的客户端 Web 应用上,从架构的角度来看,这似乎很好。

如果您确实必须使用用户名和密码并且无法获得一次性令牌,您可以使用服务器端密钥对其进行加密,并在将它们发送到 API 时即时解密,所以即使有人可以劫持会话,如果没有服务器端密钥,他们将无法获得用户名和密码,但无论如何你应该更加小心泄露你的 php 会话。

PHP Session Security

按照该问题的答案中概述的步骤进行操作,但您应该对用户与 web 应用之间以及 web 应用与 REST API 之间的所有交互使用 HTTPS。

【讨论】:

  • 所以我没有应该/可以做的事情,比如应用加密、加强服务器/PHP 设置等等?
  • 谢谢,很棒的文章。如果没有进一步的答案,我明天给你绿色。 :) 另外,我发现这篇文章提供了一种混淆会话的简单方法:php.net/manual/en/class.sessionhandler.php 您是否正在考虑类似的事情?
  • 就是这样,只要您不将密钥存储在会话本身中。但是,我认为您不需要对整个会话数据进行加密。
  • 最后一件事:加密会话的主要价值在于,如果它是一个共享系统,那么其他用户可以在主机上的共享存储中看到它们。而如果有人获得对主机的 root 访问权限,那么他们可能仍然能够获取密钥并解密会话?
  • 没错。虽然任何拥有会话 ID 的人都可能获得会话,但他们需要访问服务器才能获得解密它的密钥。
最近更新 更多