两个表中的身份验证查询?

时间:2011-11-03 09:08:23

标签: php mysql

我的网站有针对用户和管理员的单独表格

现在我想授予某些用户访问管理区域的权限

我的问题是管理员和用户表

我不知道我是否应该将身份验证数据从用户表复制到管理员表,以便他们可以登录管理员,或者执行查询以在两个表中搜索用户名和密码,只需使用级别列来验证他们的访问权限?

这样的事情?

$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';
}

2 个答案:

答案 0 :(得分:2)

我发现您在数据库中以明文形式存储密码 这是一个重大的安全风险,绝不应该这样做 密码应始终使用安全散列函数存储为salted哈希值 我也没有看到管理员和非管理员使用单独的表。

我建议你改变你的桌面布局。

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 :(得分: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';

但是你应该在users表中创建一个字段并使用int来赋予权限: 0是用户,1是超级用户,2是主持人,3是管理员...这是一个例子。然后在PHP中使用DEFINE来设置你的类。另外,编码您的密码。我推荐SHA-512。