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