PHP会话变量有多安全?

oym*_*oym 51 php security

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

谢谢.

Ant*_*ony 72

会话比cookie更安全.但是仍然可以窃取一个会话,因此黑客可以完全访问该会话中的任何内容.一些避免这种情况的方法是IP检查(它工作得很好,但是非常低,因此它本身不可靠),并且使用随机数.通常使用nonce,您有一个每页"令牌",以便每个页面检查最后一页的nonce是否与它存储的内容相匹配.

在任一安全检查中,都会失去可用性.如果您进行IP检查并且用户位于内部网防火墙(或导致此问题的任何其他情况)后面,该防火墙不能为该用户保留稳定的IP,则每次丢失其IP时都必须重新进行身份验证.使用随机数,您将获得始终有趣的"点击返回将导致此页面中断"的情况.

但是使用cookie,黑客可以通过使用相当简单的XSS技术来窃取会话.如果将用户的会话ID存储为cookie,则它们也容易受到攻击.因此,即使会话只能被可以执行服务器级别的黑客攻击(这需要更复杂的方法和通常一些特权,如果您的服务器是安全的),您仍然需要一些额外的验证级别每个脚本请求.你不应该一起使用cookie和AJAX,因为如果你的cookie被盗,这会让你更容易完全去城里,因为你的ajax请求可能无法对每个请求进行安全检查.例如,如果页面使用nonce,但页面永远不会重新加载,则脚本可能只检查该匹配.如果cookie持有身份验证方法,我现在可以使用被盗的cookie和AJAX漏洞去城镇做我的邪恶.

  • 需要注意的是,PHP将会话ID存储为cookie. (23认同)
  • 关于nonce的wiki文章非常简单,但有很好的链接:http://en.wikipedia.org/wiki/Cryptographic_nonce基本的想法,据我所知,就像一个令牌,但它只能使用一次(数字)用过一次).每个页面请求检查最后一个nonce并创建一个新的nonce.因此,如果我尝试对你的密码进行蛮力攻击,我会得到一次,因为第2轮的nonce将不匹配.如果我窃取会话和该页面的nonce,我可以继续发出请求并更新nonce直到你发出一个抛出nonce匹配的请求.因为它会看到我的请求和我的随机数,更新... (6认同)
  • @Pacerier - 2年后,我和AJAX都走了很长的路.我现在尝试在每个可能的级别实现相同的安全技术,正如您所建议的那样.我当时不知道的一个功能是能够在每个请求上重置会话ID.这不仅可以降低被盗会话ID cookie的风险,而且还可以按请求完成,因此ajax和标准请求可以获得相同的安全性好处(以及潜在的利用). (2认同)

Chi*_*oft 15

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

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


Bre*_*erg 12

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

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

当您控制服务器上的所有虚拟主机时,这不是什么大问题,但如果您在共享计算机上,则会出现问题.