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

时间:2011-10-13 09:27:16

标签: php security

存储例如

等用户权限是否安全
$_SESSION['username']='vputin';
$_SESSION['ip']=$_SERVER['REMOTE_ADDR'];
$_SESSION['canlaunchnuclearstrike']=true;

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

4 个答案:

答案 0 :(得分:5)

这完全取决于你所说的“安全”。没有“安全”的抽象概念。您只能抵御特定威胁。 (这被称为你的“威胁模型”。)如果你没有说出你想要保护什么,那就不可能说你的解决方案是否好。当然不能保证僵尸在登录你的网站时不会来吃你的网站用户!

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

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

一切都取决于!可能最好不要在共享主机上用PHP编写你的nuke strike管理应用程序...

答案 1 :(得分:1)

通常,最好只在会话中存储当前用户的ID,并从他们来自的位置“实时”查找权限 - 例如权限数据库。

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

答案 2 :(得分:0)

可能会有会话劫持或其他方式从会话中读取信息。 因此,未加密的密码将是一个安全问题,但在用户名不是什么大问题之前,您可以将其保存在会话中。

(或使用用户ID并将其编码为脚本中的用户名)

所以作为结论:只保存“公共”数据,“nuklearmissile”等应该在代码中解决而不依赖于会话数据。

答案 3 :(得分:0)

会话数据保存在服务器上。用户只是将会话ID转换为cookie,因此服务器知道它是哪个用户。

的问题:

  • 会话ID可能被盗,有人可以伪造身份
  • 共享主机上的会话数据可以在一个托管服务器的相同用户之间共享(在恶劣的托管服务器上),因此其他人可以使用相同的托管服务器访问您的会话数据。

会话是存储用户身份的好方法,但在那里存储合理的信息并不是一个好主意。