php - 使用 PHP 自动登录安全,如何以及为什么

标签 php security

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

5年前关闭。




Improve this question




我知道这个问题已经被问过很多次了,但我对此有一点不同的看法。这是一个两部分的问题。

首先,我正在实现自动登录,我想知道我的工作流程中的任何漏洞。

其次,我不清楚黑客将如何使用他们窃取的信息来破坏系统。

第一部分,这是我的工作流程,哪些部分容易受到攻击。以下是一些可能会或可能不会有帮助的信息,我使用的是 PHP 5.6.21。我将使用他们的新哈希 API,它使用最新的哈希技术并自动对其进行加盐。我使用的是 MVC 架构,所以除了我的前端 Controller 和个人 Assets 之外,几乎所有东西都在 Web 服务器的根目录之外。

  • 成员(member)登录并选中自动登录复选框
  • 带有散列值的 cookie 与成员表中的散列值相匹配,被写入他们的浏览器。 cookie 只能从服务器上的成员目录访问,该目录位于根目录之外。此外,还设置了 httpOnly 属性。
  • 下次成员登录时,会检查该 cookie 是否存在,如果存在,则使用哈希值作为键在成员表中查找该成员。
  • 如果找到,请登录。如果设置了 cookie,但没有找到匹配的记录,则 cookie 可能被篡改。在这种情况下,在数据库中创建一个新的自动登录哈希并删除成员浏览器中的 cookie。然后,强制他们手动登录。如果他们再次选择自动登录,则会返回到第 1 步,这次使用新的哈希值。

  • 所以,它非常简单,没有用户数据存储在 cookie 中,只是一个无意义的散列。

    我的问题的第二部分更笼统。假设黑客以某种方式破坏了自动登录 cookie 并获取了密码。他们可以用它做什么?他们怎么能用它来危害我的系统?

    在 SQL 注入(inject)的情况下,我知道数据转储可能是可能的,并且黑客可以获得您数据库的只读 View 。在这种情况下,必须使用散列和加盐密码!他们可以通过他们的邪恶机器运行这些哈希,并可能获得您的登录凭据。

    我正在阅读一些关于为什么采取所有这些措施很重要的安全文件。它一直在说,如果黑客可以访问您的数据库……但是,如果黑客可以访问您的数据库(具有写入权限),这一切都不重要,因为无论您的哈希值有多强,您都会被搞砸。

    谢谢你的时间!

    最佳答案

    这有两个部分:

  • 确保您的 session 是安全的。 Read this有关 session 安全性的入门,以及配置示例。剧透:HTTPS 是强制性的,确保您使用 CSPRNG 作为 session 标识符,并且您在权限提升期间(和/或定期)重新生成 session ID。
  • 安全实现基于 cookie 的身份验证 token ,当用户使用有效 cookie 访问您的网站但没有事件 session 时,该 token 将透明地重新验证用户。我以前写过很多关于 side-channel-resistant persistent user authentication 的文章.

  • 第二部分更有趣,因为很多人停留在“生成随机 token ,存储在 cookie 中,然后在数据库中查找”这一步。

    您可以安全地假设您的高度优化的数据库查询不是在恒定时间内比较字符串,就像您需要这样做以防止计时攻击一样。

    解决方案是将您的 token 分成两部分:一个用于数据库查找(定时泄漏),另一个用于在恒定时间内进行比较。
  • 第一部分(称为选择器)存储/索引在您的数据库表中。
  • 第二个(称为验证器)部分以明文形式存储在用户的 cookie 中,但在数据库中进行散列(例如 SHA256)。

  • 根据选择器检索 token 后,使用 hash_equals() 将用户提供的验证器的哈希值与存储的哈希值进行比较。 .

    每个长期身份验证 token 只能使用一次。之后,应向最终用户发出更换件。注销应该清除 cookie,而 session 应该在浏览器关闭时过期。

    这仅在您将 HTTPS 与 HSTS 一起使用时才是安全的,并且您的 cookie 设置为仅 HTTPS! (这意味着 securehttpOnly 都设置为 true 。)

    您可以看到此系统的示例 herehere .

    关于php - 使用 PHP 自动登录安全,如何以及为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37348725/

    相关文章:

    php - 子查询 where 条件来自 Codeigniter 中的不同表

    独立应用程序中的 Spring Security

    php - 用户名(和密码)中的 Unicode?

    objective-c - "because it is not SIP-protected"- macOS Mojave 中的 Apple 事件错误

    php - SQL 可以本地处理这样的事情吗?订单字段

    php - DOMXPath - 获取节点

    database - 在postgresql中创建隐藏列

    php - 我如何才能 100% 确定 HTML 标签内的 JS?

    javascript - 从选择菜单选项创建唯一的隐藏字段 IDS

    javascript - 显示所选选项的数组值