Пример (теория) безопасной авторизации пользователей и администратора. Вопросы.

kruglov

Новичок
> ...но картинка не будет отображаться и только если в строке url ввести какой-то ключ и значение...

Вообще-то для особо секретных вещей есть SSL и пользовательские сертификаты. У кого на компьютере/флешке есть сертификат (пароль тыщи на 2 символов) - того пустим.

А то какая-то партизанщина.

p.s. Ну сделайте минимальную длину пароля админа 20 символов - никакой перебор не поможет
 

Гриша К.

Новичок
kruglov, спасибо за ответ.

По SSL, немогу найти материала, непонимаю что вообще нужно сделать для безопасного соединения.
Но я думаю на самом деле для админитратора сделать пароль символов 15-20.

Исходя из всех объяснений, напишу изменения, к описанному в самом начале, методу авторизации, и если такой метод приемлем, то буду его использовать:
(1) Данные вводимые пользователем (логин и пароль) обрабатываю только так: удаляю пробелы - trim(), прослэшиваю перед записью в БД - mysql_real_escape_string().
(2) Пароль шифрую при помощи crypt:
# Записываю пароль в БД так (без указания salt) - crypt($password)
# Извлекаю пароль из БД ($password) для данного пользователя и просто сравниваю его с введенным паролем:
PHP:
$query = mysql_query("select password from users where username = '$username'"); 
$password = mysql_reult($query1, 0, 'password') 

if (crypt($password_input, $password) == $password) {
// То пароль верен
}
(3) SLEEP() использовать для задержки не буду, от DDOS-аттак непоможет, как я понял из объяснений.

Скажите пожалуйста, а как к примеру на этом форуме делают задержку на выполнение запросов при поиске, т.е. если я сделаю два запроса подряд в поиске, то будет сообщение, о том, что запрос можно повторить только через 3 секунды???

И стоит ли разделять таблицу обычных пользователей с таблицей администратора и модератора, или никаких плюсов в безопасности здесь нету, и можно все в одну таблицу???


И тако вопрос, немного не по теме, но если кто-то может, то ответте пожалуйста:
вот к примеру я делаю таблицу для неудачных авторизаций:
userdanger(username, date, time) - получается здесь нету первичного ключа, потому что username будет соответсвовать таблице users (если надо будет делать объединение), нормально ли так оставить или сделать еще id c auto_increment?
 

Positive

Новичок
С crypt надо делать так:

Положил в базу crypt($pass, $pass);

Потом получаешь его из базы например как $hash.

Сравниваешь if ($hash == crypt($input_password, $input_password).

Что касается автоизации как я описал выше, через виртуальный хост - то да, без прямой настройки апачи это не провернуть.

По поводу "секретной" страницы. Это довольно распространенный способ, однако, меня всегда поражало, Зачем если страница "секретная" и никто ее не знает записывать ее адрес в robots.txt??

Попробуй просто ради интереса посмотреть robots.txt разных сайтов. У многих туда забит адрес админки. Вот так делать не надо :)

Ну и пока у тебя shared-хостинг, почему ты не уделяешь внимания атакам через сайты, размещенные на этом же сервере? Никто ведь не знает насколько корректно настроен сервак хостером..
 

Гриша К.

Новичок
Positive, спасибо за разъяснения.
Вот при таком варианте, crypt($pass, $pass), получается, что если я к примеру сделаю $pass = 'phpclub', то результат будет всегда: phIN.Ldy9UiUE, получается что оже самое, что при шифровании MD5(), только короче.
Получается что у хакера есть база данных популярных паролей из 10000 слов, он их все обрабатывает как crypt('слово', 'слово'), получается что при таком шифровании возможна расшифровка пароял?

С robots.txt я уже на личном опыте убедился, в том что нельзя туда записывать секретную страницу (да еще и парольн на нее не ставил, думал раз не проиндесирована, значит не найдут : ), но спасибо что написали об этом.


почему ты не уделяешь внимания атакам через сайты
Я про это даже ничего не знаю, немоглибы вы поянить эту проблему в безопасности, чтобы хотябы нужно в поиске искать.
 

Andreika

"PHP for nubies" reader
Positive
а ты с crypt ничего случаем не напутал? в мануале другое написано
 

Positive

Новичок
Andreika
На самом деле может и напутал, давно не имел дело.

Я про это даже ничего не знаю, немоглибы вы поянить эту проблему в безопасности, чтобы хотябы нужно в поиске искать.
Честно говоря, я не в курсе где об этом можно почитать. Но если например криво настроен сервер, и допустим на нем сосуществуют твой сайт - site1.ru и сайт другой компании - site2.ru. Ты свой защищаешь как можешь, а site2.ru - насквозь дырявый. Злоумышленник может используя дыры site2, получить доступ к файловой системе и прочитать например твой config.php в котором пароли от твоей базы, или какой-нибудь еще твой скрипт в исходниках и узнать оттуда алгоритмы и т.п. и т.д.

-~{}~ 11.04.06 12:31:

Вот кстати пожалуйста :)

http://phpclub.ru/robots.txt
 

440hz

php.ru
Автор оригинала: Гриша К.
440hz, спасибо за ответ.
Посмотрел вашу админку: после нексокльких неудачных попыток авторизации выскочиал ошибка - увидел данные своего компьютера - интересно. : )
можно повторить и показать что именно?
 

Гриша К.

Новичок
Positive, по поводу crypt, я думаю буду использовать его так, как описал в предыдущем сообщении (http://phpclub.ru/talk/showthread.php?postid=600102#post600102).

А вот, что яндекс показывает запрещено для индексации - непонятная разница.



440hz, а больше так неполучается, логин я вводтл "supre", а пароль постоянно разный набор символов, и попытке на седьмой высветилось окошко, с прокруткой, где были данные моего комрьютера, был указан путь к одной папке, а дальше совсем непонятно что - Могло это быть окошко какой-то ошибки windows на моем компьютере.


И еще раз хочу задать вот эти вопросы, так как ответа не получил:

Скажите пожалуйста, а как к примеру на этом форуме делают задержку на выполнение запросов при поиске, т.е. если я сделаю два запроса подряд в поиске, то будет сообщение, о том, что запрос можно повторить только через 3 секунды???

И стоит ли разделять таблицу обычных пользователей с таблицей администратора и модератора, или никаких плюсов в безопасности здесь нету, и можно все в одну таблицу???
 

440hz

php.ru
Автор оригинала: Гриша К.
440hz, а больше так неполучается, логин я вводтл "supre", а пароль постоянно разный набор символов, и попытке на седьмой высветилось окошко, с прокруткой, где были данные моего комрьютера, был указан путь к одной папке, а дальше совсем непонятно что - Могло это быть окошко какой-то ошибки windows на моем компьютере.

И стоит ли разделять таблицу обычных пользователей с таблицей администратора и модератора, или никаких плюсов в безопасности здесь нету, и можно все в одну таблицу???
[/color]
1. во-во ... это что-то нажали у себя ...

2. я храню всех юзеров в одной таблице и авторизация единая для всех. разграничения получают на уровне групп и прав.

p.s. в один проект прикручивал авторизацию через ldap в ad. приходилось на лету создавать юзера для совместиости, т.к. были и простые юзеры и те кто через ldap логинился и ни че ... работает ...
 

Гриша К.

Новичок
440hz, я понимаю, что могу сделать столбец в таблице пользователей БД, обозначающий уровень пользователей, например для обычного пользователя сделать уровень доступа 0, для модератора 1, для администратора 2.

Получается, что форма авторизаци для них единая - вот этот момент несколько озадачивает меня, хотя для этой формы я могу сделать, чтобы проводить авторизацию только обычных пользователей (с уровнем 0).
И еще здесь один момент, пользователи имеют возможность просматривать имена других пользователей, хотя их статус не обозначается, но имя администратора (т.е. логин) можно вычеслить, что дает возможность для подбора пароля - хотя и есть защита от подбора.

У меня столько всяких сомнений и вопросов, потому что я незнаю много про безопасность сайтов.
 

440hz

php.ru
Гриша К.
ты уж определись что конкретно тебя беспокоит ...
меня вот "это" не беспокоит совершенно. тебе передают логин/пароль. ты по ним вычисляешь юзера, получаешь его права. разница в админе и обычном юзере лишь в их правах доступа. но сама авторизация единая.
 

Гриша К.

Новичок
440hz, спасибо за ответ.
Ну я так понимаю, что при разделении формы авторизации для пользователей и администратора, уровень безопасности не увеличится.

Разъясните пожалуйста еще тот факт, что например на форуме phpbb, после авторизации администратора, для входа в панель администратора, нужно дополнительно авторизоватся. Что это дает в плане безопасности?
 

440hz

php.ru
Гриша К.
думаю ничего. думаю это просто рудимент от старых версий. хотя могу и ошибаться

думаю, что вот на этом замечательном форуме, такого нет.
 

kruglov

Новичок
У phpbb по умолчанию так же. Смысл такой: админ ходит на форум часто, а в админку (грохать базу) редко. Если он ушел курить, а вместо него подсел злой хакер, то он в админку не попадет. По этим же причинам для смены пароля просят ввести старый.

-~{}~ 11.04.06 21:09:

Также, если некто сопрет куки с запомненным хэшем пароля, то в админку он опять же не попадет.
 

Гриша К.

Новичок
kruglov, спасибо за разъяснения, теперь ясно.

Ну вродебы я все свои вопросы и сомнения по этой теме уяснил, с помощью тех кто отвечал. Спасибо.
И + еще узнал работу функции crypt, и научился в запросе к БД, работать с разницей дат и времени.

Один вопрос хотел бы здесь задать, ответа на него не получил: защиту от частых запросов поиска (Флуда?) на форуме phpclub, каким образом сделана, я так понимаю там не sleep() - объясните пожалуйста принцеп, может быть для авторизации сделать тоже самое.

Я в самом начале описывал таблицу неудачных авторизаций, сделал я неудобно, а так вот будет удобней и правильней:
userdanger(username, datetime);
Где поле datetime имеет тип 'DATETIME' (00-00-00 00:00:00)
Запрос на проверку 10 неудасных авторизаций, которые были осуществлены не менее час назад, сделать так:
PHP:
$datetime = date('Y-m-d H:i:s');
$count_login = mysql_query("SELECT COUNT(*) as count FROM userdanger WHERE username = '$form[username]' and datetime > '$datetime' - INTERVAL 1 HOUR");
Тоже самое и с IP можно сделать, т.е. вместо username, IP.

-~{}~ 11.04.06 21:59:

Самое главное забыл.
Вот к примеру, пользователь когда ввел верный логин и пароль, делаю так:
PHP:
session_start();
$_SESSION['valid_user'] = $form['username'];
header('Location: [url]http://[/url]'.$_SERVER['HTTP_HOST'].$redirect);
exit;
Затем на защищенных страницах, делаю проверку:
PHP:
if (isset($_SESSION['valid_user'])) {
//то страницу отображаю
}
А чтобы также на страницах сайта, отображать меню для администратора (к примеру: удалить, изменить, и т.д.), как мне идентифицировать админа, смотреть например, если уровень доступа пользователя в БД равен 1 (админ), то делаю дополнительную переменную?:
PHP:
if ($level == 1) {
     $_SESSION['admin'] = 1;
}

// А затем проверяю на других страницах
if (isset($_SESSION['admin'])) {
//то отображаю меню для админа
}
 

440hz

php.ru
Гриша К.
у каждого юзера должен быть свой уникальный ID. В куки пишешь только его. По его ID каждый раз определяешь кто такой ходит и какие у него права.

p.s. про накладные расходы даже и не спрашивай ... 8) а то знаем мы уже твою мнительность ...
 

Гриша К.

Новичок
440hz, спасибо за ответ.

-~{}~ 12.04.06 19:01:

В ОФФТОП обоснавнно занесли. Вообще я прогнал с примером разъяснения (я его удалил), надо было леч поспать и подумать.

-~{}~ 12.04.06 20:37:

А что вы думаете по поводу того, чтобы при защите от подбора, выводить к примеру защитный код после 10 попытки и по LOGIN и по IP, т.е. если пользователь 'user', сделал 10 неверных попыток авторизации, то даже если он будет вводить другогое имя пользователя и пароль, то он всеравно должен вводить код подтверждения.
А если хакер будет пытаться с разных IP заходить, и пытаться подобрать пароль по одному логину, то он всеравно после 10 неверной попытки будет должен вводить код подтверждения.


А я проверил это вариант, на своем компьютере IP менял (128.0.0.7 и т.д.), так и буду делать. Тут в любом случае для одного логина не сделать больше 10 попыток.
 

sage

Новичок
кто что думает по поводу разбития (по крайней мере администраторской авторизации) на два этапа. Все действия, например, происходят на странице /admin/
1) Первоначально предлагается ввести только один логин и ничего больше. Проверяем в БД, смотрим существует ли такой и является ли он админом. Если всё ок, то отправляем на мыло (берём из базы) этого админа строку с секретным кодом, который перед отправкой пишем в базу. На этом перый этап заканчивается.
2) Админ щёлкает по ссылке, сверяем переданный через гет ключ с хранящимся в базе. Если всё ок, очищаем поле ключ в базе и выдаём стандартную форму авторизации (логин + пароль)

Самый главный плюс - чтобы увидеть авторизационную форму, человек должен быть админом или иметь доступ к ящику админа =) Короче, кто что думает
 

440hz

php.ru
sage
я думаю, что это паранойя ... 8) причем в финальной стадии ...
 

Rammstein

PHPClub::News
sage
Никогда не приходила в голову мысль, что письмо может задерживаться на часы? :)

440hz
> я думаю, что это паранойя ... 8) причем в финальной стадии ...
Поддерживаю =)
 
Сверху