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