用户登录会话变量。是否可能欺骗会话变量?PHP

4
当用户登录时,我使用以下策略来验证用户身份:
  1. 用户名和密码与唯一的令牌和会话标识一起存储在数据库中
  2. 如果上述条件成立,则设置会话变量 $_SESSION['logged_in'] = true
  3. 在每个页面(基础控制器)上检查 if ($_SESSION['logged_in'] > 0),否则将重定向到登录页面。
是否有可能黑客以某种方式设置 $_SESSION['logged_in'] = true;?以上策略是否存在安全问题?
请给我一篇文章或任何可以帮助我使其更加安全的内容。

您还需要实现两个会话验证器:1)IP 2)代理 - Yang
而且,你应该将所有这些内容封装到一个类中。 - Yang
它被封装在一个类中。为了举例说明,我是这样做的。 - GGio
IP验证可能对那些在公司代理后面的用户不是一个好主意,因为他们的IP地址经常会更改。检查用户代理也没有太大帮助 - 如果您可以窃取别人的会话ID,那么您肯定也可以获取他的UA字符串。 - ThiefMaster
3个回答

7
会话存储在服务器上,因此用户无法修改会话中的任何内容,除非他闯入您的服务器 - 在这种情况下,他显然可以运行 $_SESSION ['logged_in'] = true; 或执行其他绕过您代码中的任何安全措施的操作。
客户端存储的唯一内容是会话ID cookie。这是一个不包含任何数据的随机32个字符的哈希值。

0
在PHP中使用会话时,访问者的浏览器会存储一个仅包含会话ID的cookie。这个会话ID在后续请求中传回到您的服务器,并且当您发出session_start()时,服务器通常会打开一个以该唯一会话ID命名的文件。这就是数据存储的地方。
默认的会话ID相当长,因此攻击者需要很长时间才能暴力破解并猜测其他人当前已认证的会话。如果需要,可以调整cookie长度。
只要您的会话在合理的时间范围内过期,并且服务器正确地删除了过期的会话数据,您就不会遇到任何问题。

0
一个“黑客”将无法设置会话变量,除非您的代码存在某些安全问题(没有代码->无法判断,抱歉)
但我在提供的代码中发现了一个问题。请在第三步中使用isset而不是>0。严格的错误设置会在这里给您一个警告。请仅使用严格的错误设置进行开发(更好的代码,行为可预测),并为现场使用“正常”设置。
如果您真的有安全顾虑,请雇用专业的PHP程序员检查您的代码或在此处发布。

isset 不是一个好主意。他需要检查值。否则将其设置为 false 将使用户登录,这也是不好的。!empty() 可以胜任这项工作。 - ThiefMaster
为什么我要付钱让别人检查我的代码,我想学习。当你付钱让别人为你编写代码时,你永远不会学到东西。至于示例中省略了isset()和> 0,但我确实有它们。 - GGio
@ThiefMaster:也许我忘记添加那部分了。是的,但是如果没有isset,代码将在变量未设置的情况下抛出错误。 @GGio:他应该只是检查,而不是写入。只有当你有顾虑时才需要这样做。如果你只是想学习...我无法帮助你处理给定的代码。这种策略还可以,我会说像这样的东西在理论上是使用会话进行登录的正常方式(当然,会话中应该有更多信息,可能也被省略了?) - Maru

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