PHP会话安全登录

3
我的问题是如何创建一个安全的登录程序。在将用户名和密码与存储的值进行比较后,我设置了一个名为“logged”的会话变量,并将其设置为true。然后,当用户在网页上浏览时,我只需检查logged变量的真假来确定用户是否应该访问。
这是我第一次创建这样的程序。这个方法安全吗?我感觉应该还有其他措施来确保用户的有效性。

服务器如何决定何时结束保存会话数据? - Tegra Detra
4个回答

1

没错,它是安全的,但你应该采取预防措施来防止不安全的情况/攻击。

你所描述的机制没有任何问题。但实现是不完整/不具体的。你必须考虑密码存储和登录过程中要使用的程序。

针对投诉,以下是OWASP关于身份验证/会话的一些问题。

1. 在使用哈希或加密进行存储时,凭据是否始终受到保护?

是的,请将用户密码存储为盐值哈希。

2. 是否可以通过弱账户管理功能(例如,账户创建、更改密码、恢复密码、弱会话ID)猜测或覆盖凭据?

不行,这些功能应该受到安全问题/电子邮件链接的保护。

3. 会话ID是否在URL中公开(例如,URL重写)?

不应该。

4. 会话ID是否容易受到会话固定攻击的攻击?

不应该,除了登录之外,不允许用户通过任何方式设置他们的会话ID。

5. 会话ID是否超时,用户是否可以注销?

在用户没有指定“保持登录两周”的情况下,会话应该很快过期。

6. 成功登录后,会话ID是否进行了轮换?

是的,使用 session_destroy()session_start() 将实现此目的。

7. 密码、会话ID 和其他凭据是否仅通过 TLS 连接发送?

当然。

最终,您必须考虑您将要处理的数据类型。永远不要让某人获取用户的密码,因为这可能会危及他们在其他地方的数据。但是,如果您正在运行 colorakitten.com,请不要因被劫持的会话而失眠:“哦,不,有人黑了我的帐户并且把我的小猫变色了。”

阅读:PHP 会话安全


-1 那个答案太糟糕了。那个人根本不知道在说什么,我也给了那个答案一个负一的评价。 - rook
具体来说,该答案明显违反了OWASP TOP 10 2010年版A3:身份验证和会话管理失效。 - rook
不,答案并不可怕。它也没有出错。使用PHP的$_SESSION函数并将其与IP地址进行比较是完全可以的,尤其是在SSL安全连接下。 - arbales

1

任何人获取您的会话cookie,都可以以您的身份登录。如果将会话绑定到IP地址,则更加困难。但是这可能会给那些具有动态IP地址的人带来问题。由您决定是否值得这样做。


1
如果您不处理任何敏感信息,只是试图提供个人用户体验,那么您所做的就很好。然而,如果您真正关心安全问题,还有几种其他方法可供选择。第一种方法是创建一个名为“user_tokens”或类似名称的数据库表。当用户登录时,创建一个随机密钥,并将其IP地址存储在与该密钥相关联的表中。同时,在客户端计算机上的cookie中存储该密钥。每当他们尝试执行某些敏感操作时,您可以将其IP地址和cookie密钥与数据库中的相应内容进行比较。
请稍微研究一下跨站脚本攻击(XSS)和会话劫持。我上面概述的方法将真正减少这种情况的发生。

虽然这样做可以工作,但通常应避免额外的数据库查询。相反,将此信息放入cookie并进行签名。不要听我的,听Cal的意见。http://www.youtube.com/watch?v=i6Fr65PFqfk - arbales
信息存储在一个cookie中...这就是用来与数据库中的值进行比较的。Cookie并不总是安全的,因为它们可能会被盗取。如果你处理的是超级敏感的信息,那么额外的查询是值得的。 - Dexter

0

您可能还想将用户名存储在会话中,以便为用户正确定制任何页面。您所描述的是“安全”的,但是如果不知道您正在做什么,很难评估应用程序的安全性。


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