我正在使用PHP编写一个网站,其中包含布尔变量$_SESSION['logged_in']
。当数据库中存在匹配的用户名和密码时,此变量将被设置为true
。
我对Session比较陌生,想知道是否可能通过将这个布尔变量设置为true
来绕过登录流程,无论是未注册用户还是已注册用户,就像使用cookie时那样。
我知道用户必须从客户端操作服务器端变量,但我的问题是这会有多容易实现,用户应该如何完成此任务,是否存在已知的漏洞,以及如何避免此类攻击的最佳实践/预防措施?
我正在使用PHP编写一个网站,其中包含布尔变量$_SESSION['logged_in']
。当数据库中存在匹配的用户名和密码时,此变量将被设置为true
。
我对Session比较陌生,想知道是否可能通过将这个布尔变量设置为true
来绕过登录流程,无论是未注册用户还是已注册用户,就像使用cookie时那样。
我知道用户必须从客户端操作服务器端变量,但我的问题是这会有多容易实现,用户应该如何完成此任务,是否存在已知的漏洞,以及如何避免此类攻击的最佳实践/预防措施?
让我们从好消息开始:默认情况下,$_SESSION
数组是完全不可见和不可修改的,仅存在于服务器上,并且仅在服务器上的执行环境中开放给服务器。
现在回到现实:得到你的PHP代码“几乎正确”并打开客户端与服务器看到的会话之间的门是相当容易的。此外,窃取客户端会话(包括cookie)也很容易。
我建议采取一些缓解措施,这些措施已被证明非常有效:
$loggedin=($_SESSION['cookie']==$_COOKIE['session'])
的操作。这使攻击者需要同时获得cookie和会话ID。除了您的代码,任何人都无法操作会话中的值。要绕过这个限制,他必须有权限在服务器上运行代码或利用您的代码或服务器中的安全漏洞(无论哪种方式都是安全漏洞)。如果用户能够做到这一点,他可能不需要费心去调整会话值,因为他也可以直接在服务器上执行几乎任何其他操作。