PHP -在$_SESSION超全局变量中存储任何东西是否安全?


PHP - is it safe to store anything in the $_SESSION superglobal?

存储用户权限是否安全,例如

$_SESSION['username']='vputin';
$_SESSION['ip']=$_SERVER['REMOTE_ADDR'];
$_SESSION['canlaunchnuclearstrike']=true;

这个有安全问题吗?在每次页面加载时检查这个是否足够,并基于此重定向到登录页面(并退出)或继续?

这完全取决于你对"安全"的定义。这里没有"安全"的抽象概念。只有在面对特定的威胁时才能确保安全。(这就是所谓的"威胁模型"。)如果你不说明你想要保护什么,就不可能说你的解决方案是好是坏。当然,当你的用户登录你的网站时,你不能保证僵尸不会来吃掉你的网站!

也就是说,会话变量是无法通过web服务器访问的,所以它们构成了您的web应用程序的不透明状态的一部分,用户无法直接看到或利用。

另一方面,有许多攻击途径允许泄漏,窃取或滥用:如果会话cookie被盗,其他人可以接管会话(并可能发射核弹);这是一个完全常见的星巴克式场景。另一个漏洞在于服务器本身:如果会话数据存储在其他用户可读的文件中,例如在共享主机上,那么其他人可能会通过直接从服务器磁盘读取会话ID ,在您背后获取会话数据。

看情况而定!也许最好不要在共享主机上用PHP编写你的核打击管理应用程序…

在会话中只存储当前用户的ID通常要好得多,并且从它们来自何处查找"实时"的权限-例如权限数据库。

这样,您可以确保权限的更改立即反映用户能做什么和不能做什么。

可能存在会话劫持或其他从会话读取信息的方法。因此,未加密的密码将是一个安全问题,但直到用户名不是一个大问题,你可以把它保存在会话中。

(或者在脚本中使用用户id并将其编码为用户名)

所以作为结论:只保存"public"数据,"nuklearmissile"等应该在代码中解析,而不依赖会话数据

会话数据保存在服务器上。用户只是将会话id写入cookie,这样服务器就知道是哪个用户。

问题:

  • 会话id可以被窃取,但是有人可以伪造身份
  • 共享主机上的会话数据可以在同一主机服务器的相同用户之间共享(在坏主机ofc上),因此其他人可以使用相同的主机服务器访问您的会话数据。

Session是存储用户标识的一种很好的方式,但是在那里存储敏感信息并不是一个好主意。

相关文章: