2

我对 PHP 编程相当陌生,我认为会话变量可能存在一些安全问题。

我目前正在开发一个项目,该项目有 3 个模块,需要单独的登录凭据。这 3 个模块适用于学生、教师和管理。

用户登录各自的门户后,这些凭据将存储为会话变量。假设我们在浏览器中打开了 2 个选项卡,1 个打开了学生门户,另一个打开了管理门户。如果学生在管理员使用用户 id 2登录后不久使用用户 id 1登录第一个门户,则两个门户的用户 ID 似乎相同(用户 id 1)。问题是两个门户的会话变量都在浏览器中共享。

有时会话变量也会在新选项卡中从前一个会话中提取,即使在关闭它之后也是如此。(*使用 var_dump[$_SESSION]* 测试它)

有人可以向我解释如何将会话变量限制为每个门户或向我提供一些关于 php 中其他安全处理方式的提示吗?

PS:我有清除会话变量的注销按钮。如果关闭选项卡或在新选项卡中打开新门户,问题似乎仍然存在。

提前致谢。

4

2 回答 2

2

从浏览器到服务器,只会启动一个 PHP 会话(除了私人浏览选项,但这是题外话),并且在所有选项卡之间“共享”。与@fejese 的回答所建议的相反,您可以只使用一个 PHP 会话来解决您的问题。您的问题可能是您使用相同的会话变量来指示某人已登录,而不管该登录用户的访问级别如何。

当您的 3 个独立模块处理身份验证时,创建 3 个不同的会话变量来指示哪个用户已登录。例如,当学生登录时,创建$_SESSION['auth_student_id']并为其分配登录的用户(学生)ID。当老师登录时,创建$_SESSION['auth_teacher_id'],等等。

然后,根据加载的门户,忽略其他会话变量。因此,如果在选项卡 1 中加载了学生门户,请检查$_SESSION['auth_student_id']并忽略其他门户。如果已设置,则您知道门户应该显示受保护的内容,因为用户(学生)已经验证了自己。如果在选项卡 2 中加载的教师门户$_SESSION['auth_teacher_id']对其他 2 执行相同操作并忽略其他 2。

于 2013-08-15T17:50:29.073 回答
1

你有一些选择:

  1. 在门户基础上更改“session_name”

如果您更改会话名称,识别会话的 cookie 将因门户而异。请注意,不会以这种方式共享任何会话。如果用户登录到门户,他将需要再次登录到其他人。

  1. 实现会话命名空间

您可以在主 $_SESSION 对象中设置一个数组,每个子模块一个数组,并像直接使用会话一样使用每个数组。使用这种方法,您可以共享会话(在门户之间轻松实现 SSO),但会引发一些安全问题。如果您采用这种方式,那么实现一个 API 来访问会话是很有价值的。

于 2013-08-15T17:49:53.587 回答