使用Cookies在PHP中进行身份验证的最佳实践是什么?

6
我正在寻找关于如何使用Cookies在PHP中最佳实践身份验证的技巧和想法。每个php脚本是否应该检查cookie值以确定用户是否仍然登录?是否应该有一个脚本来进行此检查,并从其他脚本中包含该脚本?不同深度的文件系统中,php能否看到cookie值?例如:blahblahblah.com/ 和 blahblahblah.com/login/。它们都可以读取cookie吗?这是一篇涉及多个问题的文章,但感谢您!

安全是一个领域,如果你必须要问的话,那么你还不具备足够的经验来自己构建它。你不可避免地会创建某种漏洞,并最终为此付出代价。有一些不错的身份验证库,由深刻理解相关安全问题的人编写而成。选择其中一个并使用它。 - Frank Farmer
如果这不是一个关键应用程序,从头开始构建身份验证可能非常有教育意义。然而,由于存在许多优秀的框架(Zend Framework、Symfony、CakePHP),如果您不重复造轮子并自己完成所有工作,您将获得更好的结果。 - Silvan Mühlemann
感谢大家的回答,非常有帮助。我正在使用PHP会话来保存表单输入值,并有一个“重新开始”脚本来销毁会话。这就是为什么我想使用cookie进行身份验证而不是PHP的会话。但根据这个线程的回复,我需要在服务器端保持身份验证。还要感谢提供PHP框架参考的人。我已经使用过一些,但没有用过Symfony或CakePHP。我打算试试它们。 - Dan Whitinger
尽可能重用现有的身份验证框架,因为它确实很复杂。例如,请查看 https://github.com/delight-im/PHP-Auth - caw
4个回答

3

客户端安全性无法保证。

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

如果您希望延长会话时间,只需查看session_set_cookie_params()

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

用户登录时,请在Session中保存用户名和密码的哈希值。

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


2

以下是一些思考,没有特定的顺序:

  • 将各个层分开:持久存储与认证。
  • PHP会话非常强大,是维护持久存储的推荐方式。
  • 您可以拥有有效的会话,但没有有效的登录。
  • 避免使用多个cookie。一个就够了。PHP会话只需要一个cookie。
  • 您可以在cookie上设置子域和路径,但除非您设置了很多,否则真的没有什么意义(请参见上文)。
  • 将您想要放入cookie中的所有内容都放入会话中。
  • 您应该有一些共同的代码,所有页面都包含在其中。这是您初始化会话的地方。然后一切都会正常工作。它还可以验证登录是否有效。
  • 有一个地方进行登录身份验证以及与此相关的所有事情。
  • 不要忘记退出屏幕!

0

在安全页面中,使用一个脚本进行会话/登录检查并将其包含在其中是个好主意。至于深度,如果将目录参数设置为“/”,则可以在整个网站中访问。

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


0

Cookie是按域名设置的,因此无论您在目录结构中有多深,Cookie都将被正确读取(只要您的域名保持不变 - 注意这意味着www.example.com和example.com可以是不同的Cookie)。

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

正如Mauris所说,客户端没有绝对安全的东西 - 不要使用Cookie存储“logged_in”值,然后检查其是否为true/false!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接