【问题标题】:authentication once and use db session after it to authenticate?身份验证一次并在它之后使用数据库会话进行身份验证?
【发布时间】:2013-01-15 13:12:42
【问题描述】:

目前我有代码,用于对用户进行身份验证并将身份验证用户名和密码保存在 db 会话中,每个请求都会得到验证。

我正在考虑更改验证方法以仅对用户进行一次身份验证并在 db 会话中保持成功身份验证,但如果他是会话用户并且已经验证,则不要再次验证用户。

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

【问题讨论】:

    标签: php validation session authentication login


    【解决方案1】:

    你应该这样做:

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

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

    【讨论】:

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

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

    这也删除了一大堆会导致速度变慢的数据库访问。

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

    【讨论】:

      猜你喜欢
      • 2021-10-11
      • 2013-12-29
      • 1970-01-01
      • 2014-07-09
      • 2016-04-24
      • 1970-01-01
      • 2015-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多