【发布时间】:2010-11-13 22:40:43
【问题描述】:
我有一个登录脚本,可以根据“用户”表中的数据验证用户名/密码。此外,我有一个“角色”表,它指定给定用户的访问级别。假设我正在使用安全登录脚本,在成功登录后简单地执行附加查询以发现用户的授权级别并将其存储到会话变量中是否存在任何安全漏洞?然后的想法是,在任何具有混合权限的页面上,我可以简单地查询会话变量以发现登录用户的授权级别。
谢谢。
【问题讨论】:
我有一个登录脚本,可以根据“用户”表中的数据验证用户名/密码。此外,我有一个“角色”表,它指定给定用户的访问级别。假设我正在使用安全登录脚本,在成功登录后简单地执行附加查询以发现用户的授权级别并将其存储到会话变量中是否存在任何安全漏洞?然后的想法是,在任何具有混合权限的页面上,我可以简单地查询会话变量以发现登录用户的授权级别。
谢谢。
【问题讨论】:
应该注意的是,在 Apache 中,PHP $_SESSION 超全局变量可以跨虚拟主机访问。考虑这种情况:
当您控制服务器上的所有虚拟主机时,这没什么大不了的,但如果您在共享机器上,那就有问题了。
【讨论】:
如果您依赖存储在会话变量中的值来确定角色,那么您将无法更改数据库中的值并将其反映到用户的当前会话中。如果您查看 Zend Framework,身份验证和授权之间有明显的区别,并且手册中措辞强硬的警告仅在会话中存储最少量的数据(即“是的,他是用户 #37 并且他已登录”) .
就“安全”而言 - 除非您在共享主机上,否则无需担心。在正确配置的共享主机上,它们也应该相对安全。
【讨论】:
会话比 cookie 安全得多。但是仍然有可能窃取会话,因此黑客可以完全访问该会话中的任何内容。避免这种情况的一些方法是 IP 检查(效果很好,但 fi 非常低,因此本身不可靠),以及使用随机数。通常使用 nonce,您有一个每页的“令牌”,以便每个页面检查最后一页的 nonce 是否与它存储的内容匹配。
在任一安全检查中,都会失去可用性。如果您进行 IP 检查并且用户位于 Intranet 防火墙(或导致此情况的任何其他情况)后面,该防火墙没有为该用户保留稳定的 IP,则他们每次丢失 IP 时都必须重新进行身份验证。使用随机数,您会得到“点击返回会导致此页面中断”的有趣情况。
但是使用 cookie,黑客可以通过使用相当简单的 XSS 技术窃取会话。如果您将用户的会话 ID 存储为 cookie,他们也容易受到此攻击。因此,即使会话仅对可以进行服务器级黑客攻击的人来说是可渗透的(如果您的服务器是安全的,这需要更复杂的方法并且通常需要一定数量的权限),您仍然需要一些额外的验证级别根据每个脚本请求。您不应同时使用 cookie 和 AJAX,因为如果该 cookie 被盗,这会使您更容易完全进入城镇,因为您的 ajax 请求可能无法对每个请求进行安全检查。例如,如果页面使用随机数,但从不重新加载页面,则脚本可能只检查该匹配。如果 cookie 持有身份验证方法,我现在可以使用偷来的 cookie 和 AJAX 漏洞去城里做我的坏事。
【讨论】:
只有在您的服务器上执行的脚本才能访问 _SESSION 数组。如果您定义会话 cookie 的范围,您甚至可以将其限制在特定目录中。除了您之外,其他人可以获得该会话数据的唯一方法是将一些 PHP 代码注入您的一个页面。
对于您使用的系统,这是可以接受的,并且是保存数据库调用的好方法,但请记住,它需要用户注销并再次登录才能应用任何授权更改。因此,如果您想锁定一个帐户并且该用户已经登录,则不能。
【讨论】: