存储用户权限是否安全,例如
$_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是存储用户标识的一种很好的方式,但是在那里存储敏感信息并不是一个好主意。