PHP用户身份验证和密码安全的最佳实践

PHP用户身份验证和密码安全的最佳实践,php,authentication,Php,Authentication,在不使用CMS或重型框架的情况下,对用户进行身份验证的最佳库/方法是什么 响应应该包括您认为应该被视为涉及用户身份验证的新PHP开发标准的任何内容的建议。是一个使用bcrypt的轻量级、可变成本密码哈希库 可变成本意味着您可以在以后增加散列密码的“成本”,以无缝地提高安全性,而不必使以前散列的用户密码无效 用于哈希存储的字段大小是恒定的,即使是由于增加的不是哈希大小,而是生成哈希所需的迭代次数而增加了“成本”。是一种基于用户在常见web服务(如Yahoo、Google和Flickr)上的现有帐户

在不使用CMS或重型框架的情况下,对用户进行身份验证的最佳库/方法是什么

响应应该包括您认为应该被视为涉及用户身份验证的新PHP开发标准的任何内容的建议。

是一个使用bcrypt的轻量级、可变成本密码哈希库

可变成本意味着您可以在以后增加散列密码的“成本”,以无缝地提高安全性,而不必使以前散列的用户密码无效

用于哈希存储的字段大小是恒定的,即使是由于增加的不是哈希大小,而是生成哈希所需的迭代次数而增加了“成本”。

是一种基于用户在常见web服务(如Yahoo、Google和Flickr)上的现有帐户对其进行身份验证的方法

登录到您的站点是基于成功登录到远程站点

您不需要存储敏感用户信息或使用SSL来保护用户登录


可以找到该库的当前PHP版本。

使用HTTP AUTH登录

  • 使用Apache:
  • 也可以使用和
  • 例如,一旦通过身份验证,您只需使用
    $\u SERVER['PHP\u AUTH\u USER']
    检索身份验证期间使用的用户名

    这可能是一个比在脚本级别处理解决方案更快、有时更灵活的解决方案,但前提是需要关于用户的有限信息,因为您只需要登录时使用的用户名

    但是,除非在脚本语言中实现完整的HTTP身份验证方案(如下所述),否则不要考虑将身份验证集成到HTML表单中

    在脚本语言中滚动自己的HTTP身份验证

    实际上,您可以通过在脚本语言中模拟它来进行扩展。唯一的要求是脚本语言必须能够将HTTP头发送到HTTP客户端。关于如何使用PHP实现这一点的详细说明可以在这里找到:()

    您可以使用典型的身份验证模式、文件存储、甚至PHP会话或Cookie(如果信息不需要持久化的话)对上面的文章进行扩展,在使用HTTP AUTH时提供了更大的灵活性,但仍然保持了一些简单性

    HTTP身份验证的缺点

  • HTTP auth的主要缺点是注销可能带来的复杂性。清除用户会话的主要方法是关闭浏览器,或传递需要403身份验证的标题。不幸的是,这意味着HTTP AUTH弹出窗口将返回页面,然后要求用户重新登录或单击“取消”。在考虑可用性时,这可能不起作用,但可以解决一些有趣的结果(即使用cookie和HTTP AUTH组合来存储状态)

  • HTTP验证弹出窗口、会话和HTTP头处理由标准的浏览器实现决定。这意味着您将无法解决该实现(包括任何bug)(与其他替代方案不同)


  • 基本身份验证还意味着身份验证用户和密码显示在服务器日志中,然后您必须对所有内容使用https,否则用户名和密码也会在网络上以纯文本形式在每个查询中传递

  • 我用

    但像stackoverflow一样,我使用谷歌项目来完成繁重的工作。
    演示页面

    (OpenID)的明显优点是

    • 你不需要成为安全专家
    • 用户信任大网站的信息
    • 您可以请求(昵称等),但用户必须选择加入
    • 您不必担心:
      • 登记程序
      • 丢失/忘记密码

      • 这里有很多很好的答案,但我觉得值得一提的是--在这种情况下,不要试图重新发明轮子!以各种方式破坏用户身份验证是非常容易的。除非你真的需要一个定制的解决方案,并且拥有公司的安全方案和最佳实践知识,否则你几乎肯定会有安全缺陷


        OpenID很棒,或者如果你打算自己开发,至少使用一个已建立的库并遵循文档

        将应用程序的安全层与应用程序的其余部分分开是很重要的。如果应用程序逻辑和通信系统之间没有距离,您可以在一个地方安全地通信,而在另一个地方安全地通信。可能您会犯错误并在未加密的cookie中发送密码,或者您可能会忘记验证用户的凭据。如果没有与用户沟通的“正确方式”,您肯定会犯错误

        例如,假设您现在就是这样验证用户的:

        user_cookie = getSecureCookie()
        if (user_cookie.password == session_user.password) {
            do_secure_thing()
            ...
        }
        如果在getSecureCookie()中发现漏洞,并使用此代码在整个应用程序中验证用户,则可能找不到需要修复的所有getSecureCookie()实例。但是,如果将逻辑与安全性分开:

        if (userVerified()) {
            do_secure_thing()
            ...
        }
        

        。。。您将能够快速轻松地重新保护您的应用程序。为自己提供一种“正确的方式”来进行安全保护,您就不太可能犯重大安全错误。

        最好的身份验证是利用多因素身份验证,最好是在所有安全敏感的登录上使用无令牌版本

        密码保护,使用方便,可靠性和安全性高。除了EMC/RSA之外,还有其他几种产品可供选择。我更喜欢SwivelSecure的PINSafe

        Igor S不依赖框架(或第三方库,如OpenID)来为您完成这项工作并不是一件小事

        在10000英尺的高度上,
        // Storage:
        $stored = \ParagonIE\PasswordLock\PasswordLock::hashAndEncrypt($password, $aesKey);
        
        // Verification:
        if (\ParagonIE\PasswordLock\PasswordLock::decryptAndVerify($password, $stored, $aesKey)) {
            // Authenticated!
        }