2012-05-02 90 views
1

美好的一天,防止用户访问管理区

am面对我的管理控制面板PHP页面的代码错误。

我想阻止任何其他用户访问此页面,除非他的job_title = admin。

它的工作原理,但即使管理员himslef重新回到登录页面!

这里是代码

<?php 
include('db.php'); 
?> 
<?php 
// Inialize session 
@session_start(); 
ob_start(); 
// Check, if username session is NOT set then this page will jump to login page 
if (!isset($_SESSION['name']) || ($_SESSION['job_title'] != "admin")) { 
header('Location: index.php'); 
} 
ob_flush(); 
?> 
>? 

<!-- STARTING HTML FORMAT !--> 


?> 

任何帮助吗?

+2

确实管理员有名字吗? :) – mschr

+1

如果在@session_start()之前删除'@';'是否有错误报告? – Leri

+0

@mschr是的,但他们很多:D –

回答

0

试试这个,如果还有问题,请告诉我。

$_SESSION['name'] = 'dennis'; 
$_SESSION['job_title'] = 'admin'; 
if (!isset($_SESSION['name']) || (!isset($_SESSION['job_title']) ? false: ($_SESSION['job_title'] !== 'admin'))) { 
    echo 'Redirecting'; 
} else { 
    echo 'You\'re good! Not redirecting!'; 
} 

这可能是一种更容易理解的方法,只是放入一个函数中。

$_SESSION['name'] = 'dennis'; 
$_SESSION['job_title'] = 'admin'; 

if (!isset($_SESSION['name']) || !isBoss()) { 
    echo 'Redirecting'; 
} else { 
    echo 'You\'re good! Not redirecting!'; 
} 

function isBoss() { 
    if (isset($_SESSION['job_title'])) 
     if ($_SESSION['job_title'] === 'admin') 
      return true; 
    return false; 
} 
+0

'$ _SESSION ['name']'总是被定义的,函数'isBoss()'总是使用这个脚本返回true。顺便说一句,该函数可读性更强,只有一行:'return(isset($ _ SESSION ['job_title'] && $ _SESSION ['job_title'] ==='admin')?true:false;' – Leri

+0

I如果session ['job_title']没有被定义,或者不是admin,它将返回false,我宣布了会话姓名和职位仅限我的测试。 –

+0

会话已启动,您在调用函数之前定义'$ _SESSION ['job_title'],会话永远不会被销毁。 – Leri

0

我觉得你的问题是一个FUBAR换行符:)有没​​有添加登录页面引用,这是你解封检查,如果登录失败,会话变量。

非常小心,你把你的<?php ?>标签 - 在.inc文件,如db.php中包括 - 你可以省略上最后一行收盘?>标签,以避免意外ENTER键,然后按CTRL + S失败,潜入你的输出缓冲区(ob)中不需要的换行符。如果ob_start被激活,则在您选择或脚本结束之前,不会从服务器写入任何内容。否则,如果不是,默认是每个\ n将刷新输出并启动净荷的内容部分。

的login.php:

<?php 
session_start(); // put this on top-most line in your script 
$ok = check($_POST['user'], $_POST['pass']); 
if($ok) { 
$user = db_get_user_creds($_POST['user']); 
$_SESSION['name'] = $user['name']; 
$_SESSION['job_title'] = $user['job_title']; 
} else { 
// session_unset(); 
unset($_SESSION['name']); 
unset($_SESSION['job_title']); 
} 
?> 

admin.php的

<?php 
session_start(); // put this on top-most line in your script 
// or, use ob_start at the very first line 
// (with no widespace what so ever written out before it) 

include('db.php'); 
?> I am writing out a newline here, session/header section is going to become unstable 
<?php 
// Inialize session 
// @session_start(); moved up top 
ob_start(); 
// Check, if username session is NOT set then this page will jump to login page 
if (!isset($_SESSION['name']) || ($_SESSION['job_title'] != "admin")) { 
header('Location: index.php'); 
} 
ob_flush(); 
?> 

见 '我在这里写出来换行' 位

更深一点下来rabbithole去;沟通流程如下:

1) HEADERS such as 
Connection: keep-alive\r\n 
Content-Type: text/html\r\n (etc) 
2) DOUBLE NEWLINE (one newline with no previous chars on that line) 
\r\n 
3) CONTENTS 
Body 
Of Page