PHP 会话变量的安全性如何?

2022-08-30 10:10:47

我有一个登录脚本,可以根据“user”表中的数据验证用户名/密码。此外,我有一个“roles”表,用于指定给定用户的访问级别。假设我使用的是安全登录脚本,那么在成功登录后,只需对“roles”表执行附加查询以发现用户的授权级别并将其存储到会话变量中,是否存在任何安全漏洞?然后,我们的想法是,在任何具有混合权限的页面上,我都可以简单地查询会话变量以发现登录用户的授权级别。

谢谢。


答案 1

会话比 Cookie 安全得多。但是仍然可以窃取会话,因此黑客将完全访问该会话中的任何内容。避免这种情况的一些方法是IP检查(效果很好,但保真度非常低,因此本身不可靠),并使用nonce。通常,对于随机数,您有一个每页“令牌”,以便每个页面检查最后一页的随机数是否与它存储的内容匹配。

在任一安全检查中,都会有可用性的损失。如果执行 IP 检查,并且用户位于 Intranet 防火墙(或任何其他导致这种情况的情况)后面,而该防火墙没有为该用户保留稳定的 IP,则每次丢失其 IP 时,他们都必须重新进行身份验证。使用nonce,您可以获得始终有趣的“单击后退将导致此页面中断”的情况。

但是使用cookie,黑客只需使用相当简单的XSS技术即可窃取会话。如果将用户的会话 ID 存储为 Cookie,则他们也容易受到此问题的影响。因此,即使会话只能渗透到可以执行服务器级黑客攻击的人(如果您的服务器是安全的,这需要更复杂的方法和通常一定程度的特权),您仍然需要在每个脚本请求时进行一些额外的验证级别。您不应该同时使用cookie和AJAX,因为如果该cookie被盗,这将使完全进入城镇变得更加容易,因为您的ajax请求可能无法获得每个请求的安全检查。例如,如果页面使用随机数,但该页面从未重新加载,则脚本可能只检查该匹配项。如果cookie持有身份验证方法,我现在可以使用被盗的cookie和AJAX漏洞去镇上做我的坏事。


答案 2

只有在服务器上执行的脚本才能访问_SESSION阵列。如果定义了会话 Cookie 的作用域,甚至可以将其限制为特定目录。除了您之外,其他人可以获得该会话数据的唯一方法是将一些PHP代码注入到您的一个页面中。

至于您正在使用的系统,这是可以接受的,并且是保存数据库调用的好方法,但请记住,它将要求用户注销并重新登录才能应用任何授权更改。因此,如果您想锁定帐户,并且该用户已经登录,则不能。


推荐