PHP会话variables有多安全?

我有一个login脚本,用于validation用户名/密码是否符合“用户”表中的数据。 此外,我有一个“angular色”表,指定给定用户的访问级别。 假设我正在使用安全login脚本,是否有任何安全漏洞在简单地执行额外的查询,成功login后,对'angular色'表发现用户的授权级别,并将其存储到会话variables? 这个想法就是在具有混合权限的任何页面上,我可以简单地查询会话variables来发现login用户的授权级别。

谢谢。

会话比cookies更安全。 但是仍然有可能窃取一个会话,因此黑客可以完全访问该会话中的任何内容。 一些避免这种情况的方法是IP检查(工作得很好,但是非常低,因此不可靠),并使用随机数。 通常,对于随机数,每个页面都有一个“标记”,以便每个页面检查最后一页的随机数与它所存储的内容是否相符。

在任何一项安全检查中,都会失去可用性。 如果您进行IP检查,并且用户位于Intranet防火墙(或任何其他导致此情况的情况)的后面,而该防火墙不为该用户保留一个稳定的IP,则每次丢失IP时都必须重新进行身份validation。 随着随机数,你会得到总是有趣的“点击返回将导致此页面中断”的情况。

但有了cookie,黑客就可以简单地使用相当简单的XSS技术来窃取会话。 如果将用户的会话ID存储为cookie,则也容易受到此影响。 所以即使这个会话只能被一个可以进行服务器级别攻击的人所穿透(这需要更复杂的方法,并且通常需要一些特权,如果你的服务器是安全的),你仍然需要一些额外的validation根据每个脚本请求。 你不应该一起使用cookie和AJAX,因为如果这个cookie被盗,这会让你更容易上街,因为你的ajax请求可能不会得到每个请求的安全检查。 例如,如果页面使用一个随机数,但是页面从不重新加载,那么脚本可能只是检查那个匹配。 如果cookie持有authentication方法,我现在可以去镇上使用被盗的cookie和AJAX洞做我的邪恶。

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

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

应该注意的是,在Apache中,超全局的PHP $ _SESSION可以通过虚拟主机访问。 考虑这种情况:

  • 您的服务器托pipe两个域,example.com和instance.org。 PHP会话存储在限于域的cookie中。
  • 用户login到example.com并接收会话ID。 Example.com设置一些会话variables(存储在服务器上,而不是在cookie中)。
  • 第三方在传输过程中拦截cookie并将其传递给instance.org。 Instance.org现在可以访问example.com会话variables。

当您控制服务器上的所有虚拟主机时,这并不是什么大不了的事情,但是如果您在共享的机器上,则会产生问题。

如果您依赖存储在会话variables中的值来确定angular色,那么您将无法更改数据库中的值,并将其反映到用户当前的会话中。 如果你看看Zend框架,authentication和授权之间有明显的区别,手册中措辞强硬的警告只存储了会话中最less量的数据(即“Yup,他是#37用户和他login了”) 。

就“安全”而言 – 除非你是共享主机,否则没有什么可担心的。 在正确configuration的共享主机上,它们也应该相对安全。