【问题标题】:What is the best practice for using Cookies for authentication with PHP?使用 Cookie 进行 PHP 身份验证的最佳实践是什么?
【发布时间】:2010-12-10 16:44:20
【问题描述】:

我正在寻找有关如何使用 Cookie 最好地将身份验证与 PHP 结合的提示和想法。

每个 php 脚本是否应该检查 cookie 值以确定用户是否仍然登录?是否应该有一个脚本来执行此检查并从其他每个脚本中包含该脚本? php可以从文件系统的不同深度看到cookie值吗?

喜欢:blahblahblah.com/ 和 blahblahblah.com/login/

他们都可以读取 cookie 吗?

一篇帖子有很多问题,但谢谢!

【问题讨论】:

  • 安全是一个领域,如果你不得不问,你没有足够的经验来自己构建它。您将不可避免地制造某种漏洞,并最终为此付出代价。那里有不错的身份验证库,由对手头的安全问题有深刻理解的人编写。选择一个并使用它。
  • 如果它不是一个关键应用程序,那么从头开始构建身份验证可能会很有指导意义。 - 但是,由于那里有许多好的框架(Zend Framework、Symfony、CakePHP),如果您不重新发明轮子并自己做所有事情,您将获得更好的结果。
  • 感谢大家的回答。非常有帮助。我正在使用 php 会话来保存表单输入值,并有一个破坏会话的“重新开始”脚本。这就是为什么我希望使用 cookie 进行身份验证而不是 php 的会话。但是根据对这个线程的响应,我需要在服务器端保持身份验证。并感谢 php 框架参考。我使用了一些但没有使用 Symfony 或 CakePHP。打算试试看。
  • 您应该尽可能重用现有的身份验证框架,因为它确实很复杂。例如,看看github.com/delight-im/PHP-Auth

标签: php authentication cookies


【解决方案1】:

让一个脚本进行会话/登录检查并将其包含在安全页面中是个好主意。至于深度,您可以在 setcookie() 中定义,如果目录参数设置为“/”,那么它可以在所有范围内访问。

通常使用会话而不是 cookie 是一个好主意,因为那样更安全,但您可以决定基于 cookie 中的加密数据构建自己的会话系统,这也可以工作,但同样是会话,它存储数据建议在服务器端。

【讨论】:

    【解决方案2】:

    在客户端没有什么是安全的。

    您可以在任何浏览器上轻松更改 Cookie 上的登录标志。因此,更建议将登录相关数据保存在 php 的 $_SESSION

    如果您想延长会话,只需查看session_set_cookie_params()

    默认情况下,相同的会话将用于当前域和该域上的所有路径。因此它对 blahblahblah.com/ 和 blahblahblah.com/login/ 都是可读的

    用户登录时,将用户名和密码的hash保存在Session中。

    在每个脚本开始时,将会话的用户名和密码与数据库中的用户名和密码进行验证。如果正确,则设置一个标志(例如 $userLoggedIn = true)以在服务器端指示用户已登录。否则为 false。

    【讨论】:

      【解决方案3】:

      cookie 是每个域的,因此无论您在目录结构中的深度如何,cookie 都会被读取(只要您的域保持不变 - 注意这意味着 www.example.com 和 example.com可以是不同的 cookie)。

      我建议进行身份验证检查,将 cookie 中的会话 ID 与例如列出登录用户及其会话 ID 的数据库表进行比较 - 此检查可以在其自己的方法/包含文件中,即 include()' d 在每一页上。这样,将在每次页面加载时执行检查。 注意这是基本的,还有更安全的方法 - 其中一些已在此处的其他 cmets 中提及。

      正如Mauris said 一样,在客户端没有什么是安全的 - 不要使用 cookie 来存储您检查真/假的“logged_in”值!

      【讨论】:

        【解决方案4】:

        一些想法,不分先后:

        • 分离各个层:持久存储与身份验证。
        • PHP 会话非常健壮,是维护持久存储的推荐方法。
        • 您可以进行有效的会话,但不能进行有效的登录。
        • 避免使用多个 cookie。一个就够了。 PHP 会话使用一个 cookie。
        • 您可以在 cookie 上设置子域和路径,但除非设置很多,否则没有什么意义,不建议这样做(见上文)。
        • 将您认为可能需要的所有内容都放在会话中的 cookie 中。
        • 您应该有一些所有页面都包含的通用代码。那是您初始化会话的地方。然后一切都会正常工作。它还可以验证登录是否有效。
        • 在一个地方进行登录身份验证以及与之相关的一切。
        • 别忘了退出屏幕!

        【讨论】:

          猜你喜欢
          • 2017-06-26
          • 1970-01-01
          • 2020-06-14
          • 2018-08-31
          • 2013-04-29
          • 2014-01-23
          • 2013-01-17
          • 2014-06-23
          • 1970-01-01
          相关资源
          最近更新 更多