2012-05-02 4 views
1

Добрый день,Предотвращение доступа пользователей к административной области

У меня возникла ошибка кода с помощью моей панели управления 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 сломал его, чтобы понять, что происходит в первом примере. isBoss() не всегда будет истинным, потому что если сеанс ['job_title'] не определен или не является администратором, он вернет false. Я объявил сеанс имя и должность для моего тестирования. –

+0

Сессия запущена, вы определяете '$ _SESSION ['job_title'], прежде чем вы вызываете свою функцию, а сеанс никогда не уничтожается. – Leri

0

Я думаю, ваша проблема является FUBAR новой строки :) Добавили ссылку Войти страницу, которая незаходимого сеансовые переменные, которые проверяют на логины, если не в состоянии.

Будьте очень осторожны с тем, где вы положили свои <?php ?> тегов - и в .inc файлов, такие как db.php включают в себя - вы можете оставить из закрытия ?> метки на последнюю строку, чтобы избежать случайного ENTER, а затем CTRL + S сбои, крадущиеся в нежелательный символ новой строки в вашем буфере вывода (ob). Если ob_start активирован, ничто не записывается с сервера, прежде чем вы выбираете или заканчиваете скрипт. ELSE, если его нет, по умолчанию это то, что каждый \ 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 
Смежные вопросы