2013-07-01 205 views
7

我正在编写一个包含布尔型$_SESSION['logged_in']的PHP网站。当数据库中存在用户名和密码匹配时,它被设置为true会话欺骗(PHP)

我对会议还很陌生,只是想知道是否可以通过将此布尔值设置为true来绕过登录过程,如果未注册的用户(或者注册用户)有可能绕过登录过程,曲奇饼。我知道用户将不得不从客户端操纵服务器端变量,但我的问题是多么容易,用户如何去完成这样的任务,是否有任何已知的漏洞利用,以及避免这种攻击的最佳实践/预防措施是什么?

+2

如果客户端可以更改服务器上的会话数据而不用特意允许它,则会出现比此更大的问题。我会更担心一些蹩脚的共享主机与存储会话数据的一些共享临时目录。甚至会议固定。 – PeeHaa

+0

@PeeHaa,agree .. – verbumSapienti

+0

http://stackoverflow.com/questions/6912223/is-it-possible-to-change-a-session-variable-client-side –

回答

14

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

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

我推荐几个缓解,已被证明是十分有效:

  • 不要存放“登录”的价值 - 而不是存储“会话cookie”值,并设置cookie发送到客户端。在客户请求上,沿着$loggedin=($_SESSION['cookie']==$_COOKIE['session'])的方向做一些事情。这使攻击者需要:Cookie和会话ID。
  • 经常刷新会话cookie,在错误的cookie上终止会话。如果黑帽会议窃取cookie和会话,真实用户的下次点击将注销两者并创建可登录事件。
  • 如果您的请求来自JS,请考虑创建一个简单的身份验证函数:不要发送身份验证令牌,而要发送身份验证令牌,将其添加到时间戳中,然后对其进行哈希处理。发送盐,时间戳和散列。让服务器检查时间戳。
+0

谢谢你的信息和伟大的建议 – verbumSapienti

+1

我喜欢盐胡椒的东西 –

1

除了您的代码之外,任何人都无法操作会话中的值。为了避免这种情况,他必须有权在服务器上运行代码或利用代码或服务器中的安全漏洞(无论是安全漏洞)。如果用户能够这样做,他可能不需要打扰会话值,因为他也可以直接在服务器上做其他任何事情。

0

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

1

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

编辑:为了防止它的安全措施,看看Eugen Reck的帖子。