我可以在PHP会话变量中安全地存储用户名和密码吗?

9
我希望在REST API之上构建一个轻量级的Web应用程序,用户只需验证一次,之后所有针对Web API的请求将通过某种方式保持用户名和密码的活动状态。我已经制作了一个工作原型,如果对REST API的第一次请求成功,就将用户名和密码存储在会话变量中,然后从此以后,每个请求都是使用从会话变量获取的auth信息进行的。到目前为止还不错。但是,采用这种方法,任何可以访问服务器的人都可以读取密码。有没有PHP的方法可以采用适当安全性的方法跟随我的方法呢?
更新一些细节:
这里的预期目标是基于用不同数据查询检索到的API的数据制作数据可视化,但不需要用户在每次尝试时输入用户名和密码。因此,API是完全无状态的,但具有GUI的Web应用程序应该是有状态的。
在这种情况下,我无法控制Rest API,因此对它的每个请求始终需要发送具有基本认证的API用户名和密码,没有任何替代方案,例如API密钥,会话令牌等等。这就是为什么我必须在用户会话持续时间内保留用户名和密码,并且想知道在会话变量中存储它们的方法是否被认为是安全的。

3
这不违背 REST 的原则吗? - user2176127
1
这有点不清楚。您能详细说明一下在这种情况下客户端是谁吗?您是如何登录和查询API的?您将在哪里存储用户名和密码? - Pekka
我希望从我的原始问题中清楚地表明,我正在使用存储在PHP $ _Session变量中的用户名和密码执行对REST Api的HTTP请求,以便我的用户只需输入一次,但现在我已经更新了问题并提供了更多信息。 - Bjørn Otto Vasbotten
你的问题仍然不清楚。为什么每个请求都包含用户名和密码时,必须将用户名和密码存储在会话中? - Marcus Adams
因为我希望用户只需要使用他们的API用户名和密码登录我的Web应用程序一次。 - Bjørn Otto Vasbotten
1个回答

1
只要你不在REST API服务器上存储会话状态,只在客户端Web应用程序上存储,从架构角度来看,似乎没问题。
如果您确实必须使用用户名和密码,并且无法获得一次性令牌,则可以使用服务器端密钥对其进行加密,并在发送到API时即时解密,因此即使有人可以劫持会话,也无法获取用户名和密码,但是您仍应更加小心地泄露php会话。
请参考PHP Session Security中的答案所概述的步骤,除了您应该在用户和Web应用程序之间以及Web应用程序和REST API之间使用HTTPS进行所有交互。

那么我不需要进行像应用加密、加强服务器/PHP设置等方面的操作吗? - Bjørn Otto Vasbotten
谢谢,好文!如果没有更多的答案,我明天会给你点赞。另外,我找到了一篇文章,介绍了一种简单的混淆会话的方法:http://www.php.net/manual/en/class.sessionhandler.php这是你想要的吗? - Bjørn Otto Vasbotten
那就是这个想法,只要你不将密钥存储在会话本身中。但是,我认为您不需要加密整个会话数据。 - Pedro Werneck
最后一件事:加密会话的主要价值在于,如果它是一个共享系统,那么其他用户可以在主机上的共享存储中看到它们。但是,如果有人获得了主机的root访问权限,那么他们很可能能够获取密钥并解密会话? - Bjørn Otto Vasbotten
没错。虽然拥有会话 ID 的任何人都可能获取会话,但他们需要访问服务器才能获得解密密钥。 - Pedro Werneck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接