10

我正在用 PHP 编写一个包含布尔值的网站$_SESSION['logged_in']。这设置为true当用户名和密码匹配存在于数据库中时。

我对会话很陌生,只是想知道未注册(或就此而言,已注册)用户是否可以通过将此布尔值设置为 绕过登录过程true,就像使用 cookie 一样。

我知道用户必须从客户端操作服务器端变量,但我的问题是这有多容易,用户将如何完成这样的任务,是否有任何已知的漏洞,以及什么是避免此类攻击的最佳实践/预防措施?

4

4 回答 4

16

让我们从好消息开始:$_SESSION默认情况下,该数组对客户端完全不可见且无法操作:它存在于服务器上,并且仅存在于服务器上,位于不对客户端开放的执行环境中。

现在回到现实:这很容易,让您的 PHP 代码“几乎正确”,从而在服务器看到的客户端和会话之间打开一扇门。除此之外,窃取客户端会话(包括 cookie)非常容易。

我推荐一些已被证明非常有效的缓解措施:

  • 不要存储“登录”值 - 而是存储“会话 cookie”值,并将 cookie 设置给客户端。根据客户的要求,做一些类似的事情$loggedin=($_SESSION['cookie']==$_COOKIE['session'])。这使得攻击者同时需要:cookie 和会话 ID。
  • 经常刷新会话 cookie,在错误的 cookie 上终止会话。如果黑帽窃取了 cookie 和会话,真实用户的下一次点击将注销两者并创建一个可记录的事件。
  • 如果您的请求来自 JS,请考虑创建一个简单的身份验证函数:不要发送身份验证令牌,而是对其进行加盐,在其上添加时间戳,然后对其进行哈希处理。发送盐、时间戳和哈希。让服务器检查时间戳。
于 2013-07-01T21:02:46.407 回答
1

除了您的代码之外,任何人都不可能在会话中操作值。要想绕过它,他必须有权在服务器上运行代码或利用代码或服务器中的安全漏洞(无论是安全漏洞)。如果用户能够做到这一点,他可能不需要费心摆弄会话值,因为他实际上也可以直接在服务器上做任何其他事情。

于 2013-07-01T20:56:05.283 回答
1

会话领域中最常见的问题是会话劫持。这是因为会话与会话参数相关联。用户每次向服务器发送请求时都需要提供此参数。正如您可以想象的那样,如果有人能够猜测或检索参数,他们应该可以“劫持”会话。

编辑:有关针对它的安全措施,请查看 Eugen Reck 的帖子。

于 2013-07-01T21:06:00.623 回答
0

我能看到这种攻击可能发生在哪里的唯一方法是你的代码中是否存在其他漏洞,或者他们是否可以访问你的服务器(通过另一种方式)。当然,如果他们可以访问您的服务器,他们就可以访问您的数据库、源代码,可能还有网络日志,可能还有包括密码在内的所有原始互联网流量......

于 2013-07-01T20:57:00.027 回答