php、管理员和用户从同一浏览器登录,导致会话变量被意外更改

php、管理员和用户从同一浏览器登录,导致会话变量被意外更改,php,login,session-variables,Php,Login,Session Variables,管理员和用户都可以登录。登录后,他们可以浏览相同的页面 管理员和用户可以选择插入、编辑和删除项目 管理员可以为任何人创建的任何项目执行所有这3项任务。但用户只能对自己创建的项目执行这些任务。所以数据库中有跟踪谁创建了一个特定的项目 $\u会话['admin\u user']如果是管理员,则分配1,否则分配2。此会话变量决定页面是供管理员使用还是供任何其他用户使用 但是,如果管理员登录,然后另一个用户也从同一浏览器登录,则会话变量将获得后一个值 无论出于何种原因,假设管理员和用户可以同时登录到同一

管理员和用户都可以登录。登录后,他们可以浏览相同的页面

管理员和用户可以选择插入、编辑和删除项目

管理员可以为任何人创建的任何项目执行所有这3项任务。但用户只能对自己创建的项目执行这些任务。所以数据库中有跟踪谁创建了一个特定的项目

$\u会话['admin\u user']
如果是管理员,则分配1,否则分配2。此会话变量决定页面是供管理员使用还是供任何其他用户使用

但是,如果管理员登录,然后另一个用户也从同一浏览器登录,则会话变量将获得后一个值

无论出于何种原因,假设管理员和用户可以同时登录到同一浏览器


如何确保即使这两种不同类型的用户以上述方式进入网站,他们都会获得相应的页面(即,当管理员单击菜单链接时,他/她将获得预期的页面,同时来自同一浏览器的任何用户也会获得预期的页面)

$\u会话['admin\u user']如果是管理员,则分配1,否则分配2。此会话变量决定页面是供管理员使用还是供任何其他用户使用。

if ($_SESSION['user']==1){

echo 'wHAT ADMIN CAN DO normally all even delete'; 

}else if($_SESSION['user']==2){

echo 'Maybe only add , view , update'; 

}

请确保设置重定向标题以将非用户限制在页面中

如果您的用户使用同一个浏览器,则您也无法中继正常会话功能,因为它在浏览器中共享。例如,这就是为什么您可以打开新窗口/选项卡的原因

因此,我们不能使用cookies来创建会话,而是需要在URL中的每个请求中发送会话信息

选项1:使其成为一个单页网站,并使用ajax加载数据

选项2:在用户URL:s中包含会话id

编辑:一个更简单的选择是让你的用户使用匿名模式。这样,会话就不会与其他实例共享。我有时会用它在不同的gmail账户上登录两次。(不同的浏览器供应商使用自己的名称调用该功能)

Edit2:首先,会话是由服务器在浏览器中设置cookie创建的。该cookie只包含一个“随机”字符串。该字符串可以对应于服务器上的一个文件(最常见)或数据库中的一行(如果您有多个前面有负载平衡器的web服务器,则很实用。如果其他用户猜测该随机字符串的位置,他将访问用户会话(这也称为会话劫持)

您可以将会话保存在URL中,如
http://www.example.com/?sess_id=jdR3Tfs
。您可以很容易地自行构建此逻辑,但在大多数web框架中都有帮助程序,例如PHP

在php.ini中设置

session.use_cookies=0
session.use_trans_sid=1 
有时需要在上面的安排中手动获取会话id,如果我没记错的话,它应该是这样的:

session_id($_GET['sessionid']);
session_start();

为了确保您可以只执行
打印($\u GET)
或直观地查看创建的URL

否则,您可以手动执行更多操作

<?php
// testpage.php
session_start();
if (isset($_SESSION['test']){
    $_SESSION['test'] = 'Back again!';
}
$_SESSION['test'] = 'Hello world!';
?>
<p><?php echo $_SESSION['test']; ?></p> 
<a href="testpage.php?<?php echo htmlspecialchars(SID); ?>">Click me</a>.

发布您的代码,如何将值分配给会话非常简单。如果登录来自管理登录部分,则
$\u会话['admin\u user']=1
如果它来自用户登录部分,则会话变量分配为2。据我所知,您为同一变量分配了不同的值,您可能应该有两个变量:$\u session['is\u admin']=1,$\u session['is\u user']=1会话始终在浏览器中共享。否则,您无法浏览到新页面并仍然登录。解决此问题的唯一方法是将其设置为单页ajax站点,这样它就不会重新加载(而不依赖于会话)。或者您可以教用户什么是“匿名模式”是。@jeromesmadja,当管理员和用户都登录时,应该使用哪个会话变量?`$\u session['is\u admin']`或
$\u session['is\u user']
?您的页面上有多少管理员和用户,您的客户是否具有唯一id?您必须了解更多有关具有特权的登录系统的信息,通常有两个不同的会话,我们将为管理员存储1,为客户存储1,值通常是他们的唯一id,请在系统中设置您自己的规则,不允许他们登录在这两种情况下,您真的想为已经登录的用户显示登录面板吗?问题是允许这两种情况。
为已经登录的用户显示登录面板
-请问您的意思是什么?假设url中的请求变量是
user_type
;现在用户首先登录,因此该变量得到值2,现在是admin使用同一浏览器登录,因此变量得到值1;现在用户刷新页面并单击链接转到另一个页面。请求变量将保留值1而不是2。不,忘记$session它将不起作用。您需要session_id=(长随机字符串)在URL中。它保存在一个带有时间戳的数据库中,用于计算会话超时。在该表中,您可以保存有关会话的其他信息。您使用user\u type的想法可行,但这很愚蠢,因为用户可以在无需验证的情况下在admin和user之间切换。在服务器端,您可以读取user\u type并返回用于该用途的页面r类型,并确保所有链接都包含正确的用户类型。不要这样做!如果存在安全问题,请在URL中使用会话id。您可以修改您的答案以便我更好地理解吗?
sess\u id
URL参数确定是管理员还是用户浏览页面,对吗?如果是,则在用户ogs in,如果管理员登录,然后用户刷新页面,如何确定谁登录了用户页面?那么用户不会被视为管理员吗?即使有两个会话变量
<?php
// testpage.php
session_start();
if (isset($_SESSION['test']){
    $_SESSION['test'] = 'Back again!';
}
$_SESSION['test'] = 'Hello world!';
?>
<p><?php echo $_SESSION['test']; ?></p> 
<a href="testpage.php?<?php echo htmlspecialchars(SID); ?>">Click me</a>.