PHP用户身份验证和密码安全的最佳实践
在不使用CMS或重型框架的情况下,对用户进行身份验证的最佳库/方法是什么 响应应该包括您认为应该被视为涉及用户身份验证的新PHP开发标准的任何内容的建议。是一个使用bcrypt的轻量级、可变成本密码哈希库 可变成本意味着您可以在以后增加散列密码的“成本”,以无缝地提高安全性,而不必使以前散列的用户密码无效 用于哈希存储的字段大小是恒定的,即使是由于增加的不是哈希大小,而是生成哈希所需的迭代次数而增加了“成本”。是一种基于用户在常见web服务(如Yahoo、Google和Flickr)上的现有帐户对其进行身份验证的方法 登录到您的站点是基于成功登录到远程站点 您不需要存储敏感用户信息或使用SSL来保护用户登录PHP用户身份验证和密码安全的最佳实践,php,authentication,Php,Authentication,在不使用CMS或重型框架的情况下,对用户进行身份验证的最佳库/方法是什么 响应应该包括您认为应该被视为涉及用户身份验证的新PHP开发标准的任何内容的建议。是一个使用bcrypt的轻量级、可变成本密码哈希库 可变成本意味着您可以在以后增加散列密码的“成本”,以无缝地提高安全性,而不必使以前散列的用户密码无效 用于哈希存储的字段大小是恒定的,即使是由于增加的不是哈希大小,而是生成哈希所需的迭代次数而增加了“成本”。是一种基于用户在常见web服务(如Yahoo、Google和Flickr)上的现有帐户
可以找到该库的当前PHP版本。使用HTTP AUTH登录
$\u SERVER['PHP\u AUTH\u USER']
检索身份验证期间使用的用户名
这可能是一个比在脚本级别处理解决方案更快、有时更灵活的解决方案,但前提是需要关于用户的有限信息,因为您只需要登录时使用的用户名
但是,除非在脚本语言中实现完整的HTTP身份验证方案(如下所述),否则不要考虑将身份验证集成到HTML表单中
在脚本语言中滚动自己的HTTP身份验证
实际上,您可以通过在脚本语言中模拟它来进行扩展。唯一的要求是脚本语言必须能够将HTTP头发送到HTTP客户端。关于如何使用PHP实现这一点的详细说明可以在这里找到:()
您可以使用典型的身份验证模式、文件存储、甚至PHP会话或Cookie(如果信息不需要持久化的话)对上面的文章进行扩展,在使用HTTP AUTH时提供了更大的灵活性,但仍然保持了一些简单性
HTTP身份验证的缺点
演示页面 (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!
}