Php 身份验证一次,然后使用db会话进行身份验证?

Php 身份验证一次,然后使用db会话进行身份验证?,php,validation,session,authentication,login,Php,Validation,Session,Authentication,Login,目前,我有代码,用于验证用户身份,并将验证用户名和密码保存在db会话中,该会话将在每次请求时进行验证 我正在考虑将验证方法更改为只验证用户一次,并在db会话中保持成功验证,但如果用户是会话用户并且已经验证,则不要再次验证用户 这种新方法更安全吗?或者我应该在每个请求上验证用户,即使它保存在会话中?您应该这样做: 在数据库中保留一个用户名和加密的密码表(加密=至少加盐和哈希) 让您的用户向您发送用户名和密码(可能是散列的客户端),并在散列中重新检查 检查一次凭据,并在会话中设置将用户标记为已验证

目前,我有代码,用于验证用户身份,并将验证用户名和密码保存在db会话中,该会话将在每次请求时进行验证

我正在考虑将验证方法更改为只验证用户一次,并在db会话中保持成功验证,但如果用户是会话用户并且已经验证,则不要再次验证用户

这种新方法更安全吗?或者我应该在每个请求上验证用户,即使它保存在会话中?

您应该这样做:

  • 在数据库中保留一个用户名和加密的密码表(加密=至少加盐和哈希)
  • 让您的用户向您发送用户名和密码(可能是散列的客户端),并在散列中重新检查
  • 检查一次凭据,并在会话中设置将用户标记为已验证的内容

您不应该保留密码明文,也不应该在会话表中存储额外的身份验证数据。即使您在每次请求时检查它们,实际上您只是在检查您的远程用户(即他的cookie)是否在会话的第一时间提供了正确的用户名和密码。。。如果您只是在会话中设置了一个变量,则可以得到相同的精确结果…

使用cookie而不是将用户的身份验证状态存储在数据库中。使用一个隐藏的变量名来存储加密的unix身份验证时间戳,这会使观察者更难理解。这样做的好处是,如果使用可逆密码,则需要进行简单计算以检查会话是否过期

这还删除了一大堆会导致速度减慢的DB访问


正如@Palantir所提到的,在数据库中以加密方式存储密码。当用户提供密码时,执行相同的加密并比较存储版本

检查活动状态的建议是什么?例如,如果用户在禁用时被禁用并登录,则在会话结束之前,他们仍然可以访问系统,除非您从数据库中提取该用户的数据并在每个请求中检查状态字段。在这种情况下,这是您的建议吗?或者您知道当用户的状态更改为非活动且已登录时结束用户会话的另一种方法吗?一切都取决于您需要的控制级别。大多数情况下,会话过期就足够了。但是,如果您的需求不同,您当然可以在每次请求时检索并检查用户。如果您有一个初始化代码,那就是检查用户是否仍然处于启用状态的正确位置,等等。。。