谢谢。
会话(Session)比 Cookie 更加安全。但是,有可能窃取会话并且黑客将完全访问该会话中的任何内容。一些避免这种情况的方法包括 IP 检查(效果相当好,但是很低端,因此仅凭它本身不可靠)和使用 nonce。通常情况下,使用一个每个页面的“令牌”来进行 nonce 验证,以便每个页面检查上一页的 nonce 是否匹配其存储的令牌。
在任何一种安全检查方式中,都会降低可用性。如果使用 IP 检查,而用户位于内部网络防火墙后面(或其他造成这种情况的情形),该用户将不得不在每次丢失 IP 时重新进行身份验证。使用 nonce 时,你可能会遇到“点击返回按钮将导致此页面崩溃”的状况。
但是对于 Cookie,黑客可以通过相当简单的 XSS 技术窃取会话。如果将用户的会话 ID 存储为 Cookie,则他们也容易受到攻击。因此,即使只有能够进行服务器级别黑客攻击的人才能渗透会话(这需要更高级的方法和通常需要某种特权,如果你的服务器安全性良好),你仍然需要在每个脚本请求时进行一些额外的验证。不应同时使用 Cookie 和 AJAX,因为这会使得窃取 Cookie 后完全访问更加容易,因为您的 ajax 请求可能无法在每个请求中进行安全检查。例如,如果页面使用 nonce,但页面从未重新加载,则脚本可能仅检查是否匹配。如果 Cookie 保存了身份验证方法,我就可以使用窃取的 Cookie 和 AJAX 漏洞来恶意攻击。
只有在您的服务器上执行的脚本才能访问_SESSION数组。如果您定义了会话cookie的范围,甚至可以将其限制在特定目录中。除了您之外,其他人获取该会话数据的唯一方式是将一些PHP代码注入到您的页面中。
至于您使用的系统,这是可以接受的,也是一种节省数据库调用的好方法,但请记住,它需要用户注销并重新登录以应用任何授权更改。因此,如果您想锁定一个帐户而该用户已经登录,则无法实现。
需要注意的是,在 Apache 中,PHP $_SESSION 超全局变量可以在虚拟主机之间进行访问。考虑以下情况:
当你控制服务器上的所有虚拟主机时,这并不是什么大问题,但如果你在共享的机器上,这就是个问题。