我正在用 PHP 编写一个包含布尔值的网站$_SESSION['logged_in']
。这设置为true
当用户名和密码匹配存在于数据库中时。
我对会话很陌生,只是想知道未注册(或就此而言,已注册)用户是否可以通过将此布尔值设置为 绕过登录过程true
,就像使用 cookie 一样。
我知道用户必须从客户端操作服务器端变量,但我的问题是这有多容易,用户将如何完成这样的任务,是否有任何已知的漏洞,以及什么是避免此类攻击的最佳实践/预防措施?
让我们从好消息开始:$_SESSION
默认情况下,该数组对客户端完全不可见且无法操作:它存在于服务器上,并且仅存在于服务器上,位于不对客户端开放的执行环境中。
现在回到现实:这很容易,让您的 PHP 代码“几乎正确”,从而在服务器看到的客户端和会话之间打开一扇门。除此之外,窃取客户端会话(包括 cookie)非常容易。
我推荐一些已被证明非常有效的缓解措施:
$loggedin=($_SESSION['cookie']==$_COOKIE['session'])
。这使得攻击者同时需要:cookie 和会话 ID。除了您的代码之外,任何人都不可能在会话中操作值。要想绕过它,他必须有权在服务器上运行代码或利用代码或服务器中的安全漏洞(无论是安全漏洞)。如果用户能够做到这一点,他可能不需要费心摆弄会话值,因为他实际上也可以直接在服务器上做任何其他事情。
会话领域中最常见的问题是会话劫持。这是因为会话与会话参数相关联。用户每次向服务器发送请求时都需要提供此参数。正如您可以想象的那样,如果有人能够猜测或检索参数,他们应该可以“劫持”会话。
编辑:有关针对它的安全措施,请查看 Eugen Reck 的帖子。
我能看到这种攻击可能发生在哪里的唯一方法是你的代码中是否存在其他漏洞,或者他们是否可以访问你的服务器(通过另一种方式)。当然,如果他们可以访问您的服务器,他们就可以访问您的数据库、源代码,可能还有网络日志,可能还有包括密码在内的所有原始互联网流量......