2014-02-12 212 views
0

我有一次他們點擊一個鏈接只有管理員可以訪問一個頁面。如果登錄用戶是標準用戶,則他們不應該能夠訪問該頁面。但是,當標準用戶嘗試訪問管理頁面時,他們有權訪問該頁面。管理頁面訪問

我希望一對第二眼睛,看看他們是否能發現什麼毛病代碼將使功能工作按預期。

感謝

<?php 

if(check_login() && isAdmin()) { 
    echo 'welcome administrator'; 
} else { 
    header('Location: login.php'); 
    exit; 
} 

function isAdmin() { 
    $conn = mysqli_connect("localhost", "root", "dbpass", "dbname") or die ('Could not connect to database!'); 
    $sql = "SELECT * FROM `usertable` WHERE userID ='" . $_SESSION['sess_uid'] . "'"; 
    $mainaccess = $conn->query($sql); 
    print_r($mainaccess); 
if(!$mainaccess){ 
    echo $conn->error; 
} 


if ($mainaccess -> userLevel == 0) { 
    return true; 
} else { 
    return false; 
} 
} 

function check_login() { 
if(isset($_SESSION['sess_uid']) && $_SESSION['sess_uid'] != '') { 
    return true; 
} else { 
    false; 
    return; 
} 
} 
?> 
+0

這是真正的SQL嗎?因爲你似乎沒有過濾用戶名或ID?因此,它將始終返回管理員帳戶 – Trent

+0

我認爲這是我一直在尋找的,因爲我只想管理員帳戶訪問該頁面。這就是真正的SQL。 – user3296793

+0

同意Trent,你是如何檢查特定用戶的。你不檢查用戶的ID,這是需要發生的事情。 –

回答

1

的問題是,你是從那裏他們有管理數據庫的用戶選擇訪問已經,即

SELECT `userID` FROM `usertable` WHERE `userLevel` = 0 

所以你總是顯示任何人作爲管理員。該查詢需要更改以檢查登錄用戶是否是管理員。因此更改查詢到的東西,像這樣

$sql = "SELECT * FROM `usertable` WHERE userID = $_SESSION['sess_uid']"; 

哪裏$_SESSION['sess_uid']userID

我們必須同時刪除userLevel檢查,因爲這是無關緊要的選擇用戶的時候,我們也必須從SELECT userID改變,到SELECT *,因爲如果你只能選擇userID,你不會有你的數組中的userLevel和線

$mainaccess -> 'userLevel' == 0 

不起作用。通過選擇一切可以確保所有的屬性可以被訪問,即

$mainaccess -> 'userLevel' 
$mainaccess -> 'userID' 

更新

訪問表數據的正確方法將使用兩種

對象(這是方法,你會使用)

$mainaccess -> 'userLevel'// Incorrect 
$mainaccess->userLevel //correct 

陣列

$mainaccess -> 'userLevel'// Incorrect 
$mainaccess['userLevel'] //correct 

請改變這一行

您查詢也是不正確的,請使用以下代碼塊作爲你的SQL查詢不正確的信息拉。

function isAdmin() 
{ 
    $conn = mysqli_connect("localhost", "root", "dbpass", "dbname") or die ('Could not connect to database!'); 
    $sql = "SELECT * FROM `usertable` WHERE userID = $_SESSION['sess_uid']"; 

    if($result = $mainaccess = $conn->query($sql)) 
    { 
     while($obj = $result->fetch_object()) 
     { 
      $user = $obj; 
     } 
    } 


    if ($user->userLevel == 0) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
    } 
+0

我更改了SQL語句:$ sql =「SELECT * FROM'usertable' WHERE userID ='」。 $ _SESSION ['sess_uid']。 「'」; – user3296793

+0

但是,非管理員用戶仍然可以訪問該頁面,我相信問題是我的第三條if語句與$ mainaccess - >'userLevel'== 0 – user3296793

+0

@ user3296793 True應該沒有引號,請參閱我的更新 –

0

你真正需要的東西,如:

function isAdmin() { 
    $conn = mysqli_connect("localhost", "root", "dbpass", "dbname") or die ('Could not connect to database!'); 
    $sql = "SELECT `userID` FROM `usertable` WHERE `userLevel` = 0 AND userID ='" . $_SESSION['sess_uid'] . "'"; 

正如我在評論中說,你正在尋找擁有管理員權限的任何人,但你真的想知道這是否用戶有管理員權限,因此您必須驗證您試圖找出哪個用戶有權訪問。我只是把代碼放在一起上面,以爲你是存儲用戶ID在會話(按你以後的代碼),但您可能需要更改此

+0

感謝您的輸入,我將更改我的代碼以過濾用戶標識並報告結果。 – user3296793

+0

隨着代碼更改實施,任何用戶仍然可以訪問該頁面,我相信這個錯誤可能在我的第三條if語句中。將數據庫中的結果存儲在數組中會更好嗎? – user3296793

+0

在查詢結果上提供了print_r - 因此我們可以看到我們正在處理的數據 - 您可以使用SQLFiddle嗎? – Trent

0

你的方法是錯誤的。該鏈接應該只顯示登錄管理員。

嘗試類似此測試代碼。

<?php 
session_start(); 
$_SESSION['admin'] = 0;//set only by logging in 
$html ="Test<br>";//page html 
if ($_SESSION['admin']== 0) { 
     $html .="<a href=\"adminpage.php\" >Admin</a>"; 
} 
echo $html; 
?> 

修改爲適合您的要求。

相關問題