2011-11-03 48 views
1

我的網站有用戶單獨的表和admin認證查詢在兩個表中?

現在我想給的特權訪問管理領域的一些用戶

我的問題是管理和用戶表

我不知道如果我應該將用戶表中的認證數據複製到管理表中,以便他們可以登錄到管理員,或者執行查詢來搜索這兩個表中的用戶名和密碼,並使用級別列來驗證他們的訪問權限?

這樣的事情?

$sql = "select `password` , `level` from `admin` where `username` = '$username' UNION 
(SELECT `password` , `level` FROM `users` where `username` = '$username') LIMIT 1 "; 
$result = $db->query($sql); 

while($row = mysql_fetch_assoc($result)){ 
if($password == $row['passwor'] && $row['level'] != 0) 
echo 'welcom to admin area'; 
else 
echo 'login faild'; 
} 
+1

你有錯誤,在你的代碼。你首先使用選擇'pasword'然後$ row ['passwor']。小心。 –

+0

是否有任何理由不使用用戶表中的字段來指定用戶是否具有管理員權限? – ThiefMaster

+0

您不應該在數據庫中清楚地存儲密碼。爲此,使用鹽漬的哈希。這是特別的。因爲衆所周知的事實是人們重複使用密碼,所以像這樣泄漏數據將暴露的不僅僅是**這個**網站上的數據。 – Johan

回答

2

我看到你在你的數據庫中清楚地存儲密碼。
這是一個重大的安全風險,絕不應該這樣做。
使用安全散列函數時,應始終將密碼存儲爲鹽漬散列。
我也無法看到用於管理員和非管理員的單獨表格。

我建議你改變你的表格佈局。

table user 
------------- 
id unsigned integer auto_increment primary key, 
username varchar(100) not null, 
salt varchar(20) not null, 
passhash varchar(48) not null, 
isadmin boolean not null default false 

查詢您的表:

SELECT u.id, u.isadmin FROM user u 
WHERE u.username = '$username' 
    AND passhash = SHA2(CONCAT(u.salt, '$password'),512) 
    AND isadmin = 1 

創建用戶時使用:

INSERT INTO user (username, salt, passhash, isadmin) 
    VALUES ('$username', '$salt', SHA2(CONCAT('$salt','$password'),512), '$isadmin') 
1

您可以使用LEFT JOIN和沒有必要爲一個循環:

$sql = 'SELECT `a`.`password`, `a`.`level` FROM `admin` AS `a` LEFT JOIN `users` ON `a`.`username` = `u`.`username` WHERE `a`.`username` = "'.$username.'" LIMIT 1'; 
    $result = $db->query($sql); 
    $row = mysql_fetch_assoc($result); 

    if($password == $row['passwor'] && $row['level'] != 0) 
     echo 'welcom to admin area'; 
    else 
     echo 'login faild'; 

但是,你應該在你的用戶表中創建一個字段並使用int給喜歡的權利: 0是用戶,1是超級用戶,2名主持人和3個管理員......這是一個例子。然後你在PHP中使用DEFINE來設置你的班級。另外,編碼你的密碼。我推薦SHA-512。