Php 将某人登录到网站的最安全的方法是什么?

Php 将某人登录到网站的最安全的方法是什么?,php,security,token,remember-me,login-control,Php,Security,Token,Remember Me,Login Control,我试图确定最好的方式,让别人登录到我的网站后,我已经验证了登录是正确的 我试着看看投票最多的答案说我应该生成一个令牌,然后将这个令牌存储在数据库中!当然,这是完全不安全的,因为只需要数据库黑客和cookie编辑就可以进入其他人的帐户 有人能给我提供最新的安全方法吗?谢谢。将生成的令牌以明文形式存储在数据库中显然是一种风险,但一般认为是可以接受的。一种缓解技术是要求用户在执行敏感操作之前重新验证。例如,亚马逊似乎要求我在修改帐户详细信息之前输入密码,除非我最近输入了密码 将生成的令牌以明文形式存储

我试图确定最好的方式,让别人登录到我的网站后,我已经验证了登录是正确的

我试着看看投票最多的答案说我应该生成一个令牌,然后将这个令牌存储在数据库中!当然,这是完全不安全的,因为只需要数据库黑客和cookie编辑就可以进入其他人的帐户


有人能给我提供最新的安全方法吗?谢谢。

将生成的令牌以明文形式存储在数据库中显然是一种风险,但一般认为是可以接受的。一种缓解技术是要求用户在执行敏感操作之前重新验证。例如,亚马逊似乎要求我在修改帐户详细信息之前输入密码,除非我最近输入了密码

将生成的令牌以明文形式存储在数据库中显然是一种风险,但通常认为是可以接受的。一种缓解技术是要求用户在执行敏感操作之前重新验证。例如,亚马逊似乎要求我在修改帐户详细信息之前输入密码,除非我最近输入了密码

我们最近发布了一篇关于(又称“记住我”)的博客,但这篇博客与其他博客的最大区别在于查找(不是)和验证(恒定时间)的分离

在我们在博客文章中概述的策略中,您不是在数据库中存储令牌,而是存储令牌的SHA-256散列。如果攻击者泄漏这些值,他必须破解强随机令牌的SHA-256哈希。他们最好只是启动一个反向shell,让他们作为任何用户进行身份验证(或者继续利用本地内核漏洞接管整个机器)

登录(简单和基本)
  • 使用bcrypt.特别是
    密码验证()不要自己制造盐。

    如果你想多做一点,考虑这个库来加密密码哈希(如果你的数据库和WebServer在单独的硬件上,这是非常有帮助的,因为妥协数据库不会给他们加密密钥)。

  • 尝试失败的速率限制。例如:每个IP或用户名失败5次后,需要验证码
长期坚持(“记住我”) 登录时:

  • 生成一个安全的随机令牌
  • 生成一个安全的随机标识符
  • 将标识符和令牌存储在
    rememberme
    cookie中
  • 在数据库中存储令牌的SHA256哈希
  • 当用户登陆页面时,如果他们有
    rememberme
    cookie,则抓取标识符并进行数据库搜索
  • 如果此标识符有身份验证令牌,则获取SHA256哈希
  • 使用
    hash_equals()
    将cookie提供的令牌哈希与数据库中的SHA256哈希进行比较
  • 如果成功,则将会话变量设置为该用户的ID。生成新令牌。如果失败,则从数据库中删除该条目
  • 这一战略的优势
    • 如果成功的SQL注入攻击导致令牌泄漏,则攻击者所拥有的只是各种令牌的SHA256散列。这对泄露帐户没有帮助
    • 不支持数据库搜索。这就是标识符与令牌分离的原因
    • 顺序标识符泄漏了应用程序的活动级别,许多企业希望对此保密。随机标识符混淆了这个细节
    缺点
    • (如果发现任何StackOverflow,未来的作者可以随意填写此列表。)

    我们最近发布了一篇关于(又称“记住我”)的博客,但这篇博客文章与其他博客文章最大的区别在于查找(不是)和验证(固定时间)的分离

    在我们在博客文章中概述的策略中,您不是在数据库中存储令牌,而是存储令牌的SHA-256散列。如果攻击者泄漏这些值,他必须破解强随机令牌的SHA-256哈希。他们最好只是启动一个反向shell,让他们作为任何用户进行身份验证(或者继续利用本地内核漏洞接管整个机器)

    登录(简单和基本)
    • 使用bcrypt.特别是
      密码验证()不要自己制造盐。

      如果你想多做一点,考虑这个库来加密密码哈希(如果你的数据库和WebServer在单独的硬件上,这是非常有帮助的,因为妥协数据库不会给他们加密密钥)。

    • 尝试失败的速率限制。例如:每个IP或用户名失败5次后,需要验证码
    长期坚持(“记住我”) 登录时:

  • 生成一个安全的随机令牌
  • 生成一个安全的随机标识符
  • 将标识符和令牌存储在
    rememberme
    cookie中
  • 在数据库中存储令牌的SHA256哈希
  • 当用户登陆页面时,如果他们有
    rememberme
    cookie,则抓取标识符并进行数据库搜索
  • 如果此标识符有身份验证令牌,则获取SHA256哈希
  • 使用
    hash_equals()
    将cookie提供的令牌哈希与数据库中的SHA256哈希进行比较
  • 如果成功,则将会话变量设置为该用户的ID。生成新令牌。如果失败,则从数据库中删除该条目
  • 这一战略的优势
    • 如果成功的SQL注入攻击导致令牌泄漏,则攻击者所拥有的只是各种令牌的SHA256散列。这对f没有帮助