大家好,我做过研究,似乎无法弄清楚我的代码在做什么。我知道会话变量应该改变,除非更改它们或删除它们。我认为问题不是特定于浏览器后退按钮,因为有问题的变量在访问另一个页面时似乎不起作用它只是在家里工作到另一个页面但是当我访问另一个页面时它没有似乎工作。
我正在构建一个自定义CMS(必须是自定义,我已经考虑了所有其他选项)我基本上做了一个访问控制脚本。首先,我通过将会话中的用户角色或用户类型存储为变量来尝试它,但是当按下或进入第三页时,它将无法工作。该变量用于显示菜单链接,具体取决于用户类型。
这是我检查会话的方式
$now=time();
if (!isset($_SESSION)) {
session_start();
}
if (!isset($_SESSION['session_user_name']) || $now - $_SESSION['session_start']>60*60){
header('Location:login.php');
exit;
}else{
//$user_name = $_SESSION['session_user_name'];
//$user_type = $_SESSION['session_user_type'];
}
require(CMS_ROOT.'/classes/acl.php');
$user_role = new ACL();
$user_type = $user_role->userRole;
这是我的ACL类
class ACL
{
var $userID = 0; //Integer : Stores the ID of the current user
var $userRole = ''; //String : Stores the roles of the current user
function __constructor($userID = '')
{
if ($userID != '')
{
$this->userID = floatval($userID);
} else {
$this->userID = floatval($_SESSION['session_user_id']);
}
$this->userRole = $this->getUserRole();
}
function ACL($userID='')
{
$this->__constructor($userID);
}
function getUserRole()
{
global $table_prefix;
$user_id = $this->userID;
$strSQL = "SELECT user_type FROM ${table_prefix}users WHERE user_id = $user_id" ;
$data = mysql_query($strSQL) or die(mysql_error());
$resp = 'null';
$row = mysql_fetch_assoc($data);
$resp = $row['user_type'];
return $resp;
}
}
这是菜单
<nav>
<ul>
<?php echo $user_type; if($user_type == 'administrator' || $user_type == 'manager'){?>
<li><a href="<?php echo $cms_path; ?>/index.php">Home</a></li>
<? } ?>
<?php if($user_type =='administrator' || $user_type == 'manager'){?>
<li><a href="<?php echo $cms_path; ?>/users/user_view.php" >Users</a></li>
<? } ?>
<?php if($user_type == 'administrator' || $user_type == 'manager'){?>
<li><a href="<?php echo $cms_path; ?>/clients/client_view.php" >Clients</a></li>
<? } ?>
<li><a href="<?php echo $cms_path; ?>/albums/album_view.php" >Albums</a></li>
<li><a href="<?php echo $cms_path; ?>/logout.php">logout</a></li>
</ul>
</nav>
我希望有人可以帮助或引导我朝着正确的方向前进。
答案 0 :(得分:1)
好的,我在这个过程中发现了一些事情。
1)最重要的是考虑安全问题,如果你不是一个完整的PHP安全专家,那就想找一个人。我和我的雇主必须在某个时候这样做。2)考虑缓存。后退按钮加载页面的缓存版本,以便在此过程中丢失一些动态元素。
为此,请确保至少在您的动态网页上使用此代码。
<?php // These headers tell the browser to not load anything from cache at all
// and force the browser to make a server request even on a Back click
// Allowing us to verify the token
header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header ("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header ("Pragma: no-cache");
?>
3)确保在执行任何其他会使用会话的内容之前启动会话。
4)查看PHP.ini变量设置,特别是与session.cache_limiter
和session.gc_maxlifetime
等会话相关的设置,您可以使用ini_get()
从PHP.ini变量和{{{ 1}}设置所述变量,这对几乎所有PHP.ini相关的
答案 1 :(得分:0)
无需使用
检查超时$now - $_SESSION['session_start']>60*60
会话超时由php config
控制 session.gc_maxlifetime
此外,无需使用floatval ..而是执行以下操作
$this->userID = intval($userID);