#php #mysql
#php #mysql
Вопрос:
на моем веб-сайте есть отдельные таблицы для пользователей и администратора
теперь я хочу предоставить некоторым пользователям право доступа к области администрирования
моя проблема с таблицей администратора и пользователей
я не знаю, должен ли я скопировать данные аутентификации из таблицы user в таблицу admin, чтобы они могли войти в систему администратора, или выполнить запрос для поиска в обеих таблицах имени пользователя и пароля и просто использовать столбец level для проверки их доступа?
что-то вроде этого?
$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'] amp;amp; $row['level'] != 0)
echo 'welcom to admin area';
else
echo 'login faild';
}
Комментарии:
1. У вас есть ошибки в вашем коде. Сначала вы используете select
pasword
, а затем $row[‘passwor’] . Будьте осторожны.2. Есть ли какая-либо причина, по которой вы просто не используете поле в своей таблице users, чтобы указать, имеет ли пользователь права администратора?
3. Вы никогда не должны хранить пароль в открытом виде в базе данных. Для этого используйте соленые хэши. Это особенно важно, потому что хорошо известно, что люди повторно используют пароли, поэтому утечка подобных данных приведет к гораздо большему, чем просто данные на этом сайте.
Ответ №1:
Я вижу, что вы храните пароли в открытом виде в своей базе данных.
Это серьезная угроза безопасности, и ее никогда не следует делать.
Пароли всегда должны храниться в виде соленых хэшей с использованием защищенной хэш-функции.
Я также не вижу смысла использовать отдельные таблицы для администраторов и не-администраторов.
Я рекомендую вам изменить макет таблицы.
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')
Ответ №2:
Вы можете использовать ЛЕВОЕ СОЕДИНЕНИЕ и не нуждаться в цикле :
$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'] amp;amp; $row['level'] != 0)
echo 'welcom to admin area';
else
echo 'login faild';
Но вы должны создать поле в своей таблице users и использовать int для предоставления таких прав, как :
0 — пользователь, 1 — суперпользователь, 2 модератора и 3 администратора… это пример. Затем вы используете DEFINE в PHP для настройки своего класса. Кроме того, закодируйте свой пароль. Я рекомендую SHA-512.