[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Авторизация
Страницы: 1, 2, 3
maximka787
Парни, меня попросили разработать аунтефикацию, простую, и в то же время защищенную. Посмотрите мой метод, есть ли в нем недостатки и надежный ли он вообще? Сразу оговорюсь, куки не используются.
Привязку к IP очень хотели сделать, но у меня на работе почему-то IP меняется в течение часа, постоянно логиниться совсем не айс.

1.
Вводим логин и пароль в login.php (фильтруем входные переменные и делаем запрос к БД) расписывать не буду. Вопрос не в этой части.

2.
Создаём две переменные в случае правильного логина и пароля
$user = $row['id']; //из БД.
$_SESSION['key'] = sha1(rand(1,999).$user); //ключ сессии
$_SESSION['user_id'] = $user; //номер клиента по БД.


3.
Записываем в таблицу БД данные сессии. (`key`, `user`, `date`)

4.
При попадании на любую авторизованную страницу делаем сначала проверку в таблице БД "сессии" и если данные найдены, то пускаем юзера, обновив при этом поле`date`. Если нет, то перебрасываем на страницу login.php и по новой.

if(isset($_SESSION['key'], $_SESSION['user_id']))
{
$query = "SELECT * FROM `sessions` WHERE `key` = '".mysql_real_escape_string($_SESSION['key'])."' AND `user` = '".intval($_SESSION['user_id'])."'";

//if > 0 update `sessions` SET `date` = NOW WHERE `key` = ....

}



Вопрос конкретно в том, что я не совсем понимаю, надежно ли защищать доступ исходя из конкретных двух сессионных переменных.

Любую критику буду рад слышать.

_____________
..Работает - не трогай!
AllesKlar
А для чего ты в базе сессию в данном случае сохраняешь?

Вот украл я у тебя сессию, но я же ее украл целиком и в базе все данные, которые я украл присутсвуют.

А чтобы было наличие $_SESSION['key'] и $_SESSION['user_id'], но они были бы не те, что твой скрипт туда записал (твоя проверка), это вообще надо очень постараться, а именно, изменить файл сессии на сервере. Возможно, но оооочень трудно.

_____________
[продано копирайтерам]
maximka787
Цитата (AllesKlar @ 9.06.2015 - 12:54)
А для чего ты в базе сессию в данном случае сохраняешь?

Ну как, мне же нужно с чем-то сверить значение сессии пользователя с авторизованным. Простой #_SESION['user_id'] = 1; примитивно, если без доп проверок.

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

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

В доступе к личному кабинету от посетителя требуется предоставить ключ. Либо этот ключ записать в куки, либо хранить в сессии (в рамках текущего сеанса)

_____________
..Работает - не трогай!
maximka787
В одном учебнике видел, еще когда учился, было так реализовано.

login.php

if("запись в БД" == 1)
{
...
$_SESSION['user_id'] = $row['id'];
}


secret_page.php

if(isset($_SESSION['user_id']))
{
echo profile($_SESSION['user_id']);
}


Это же полный улёт. Мне вот интересно, МОЙ верхний скрипт сильно ушел по безопасности?
Блин, что-то подсказывает, что он такой же((( хотя...

_____________
..Работает - не трогай!
maximka787
В принципе, можно даже и в куках хранить ключ. Я так подумал.

Прошел юзер авторизацию. Сохранилась на компе кука с 40 значным ключом, сформированным на сервере. А в БД "сессий" на сервере сохранился этот 40 значный ключ и ip. В дальнейшем, при попадании юзера на тот же сайт, читаем куки и сравниваем этот ключ с primary key в таблицей "Сессий" . Если совпал "ключ" и "ip" то определили номер (ID) юзера по таблице и welcome))

При желании, помимо ключа, можно даже писать не только ip но и md5($_SERVER['USER_AGENT']) чтоб точно понимать, тот же самый. Ну обновит браузер, заново, ну залогиниться еще раз.

_____________
..Работает - не трогай!
AllesKlar
1.
Вводим логин и пароль в login.php (фильтруем входные переменные и делаем запрос к БД) расписывать не буду. Вопрос не в этой части.

2.
Создаём ОДНУ переменную в случае правильного логина и пароля
$_SESSION['user_id'] = $row['id'];

Для авторизации этого достаточно.

Дальше уже можно прикручивать всякие плюшки, типа проверки юзер-агента, ip, токены etc.

Хранить в куках какой-то хитросгенерированый ключ - зачем?
ID сессии в куках будет в любом случае, это уже хитро сгенерированый ключ.


_____________
[продано копирайтерам]
ApuktaChehov
maximka787 - сессия нужна для того, что бы сервер мог определять пользователя который ходит по страницам сайта. Например, зашел я на index.php, а после перешел на index1.php. Как PHP определить что я один и тот же посетитель?

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

Последний твой пост, в принцепе верный, но недостаточно знаний самого механизма сессий. Вот мануал, кури )
тут

P.S. Мне больше нравится всегда держать в сессии данные о юзере. Если не авторизован, то $_SESSION['user_id'] = 0, а если авторизован, то айди юзера.

_____________
AllesKlar
Цитата
P.S. Мне больше нравится всегда держать в сессии данные о юзере. Если не авторизован, то $_SESSION['user_id'] = 0, а если авторизован, то айди юзера.

Серилизованый объект юзера, чтобы каждый раз базу не дергать.
Данные об юзере нужны практически на каждой странице.

_____________
[продано копирайтерам]
maximka787
Я еще посоветовался с коллегами и пришел к выводу, что самый оптимальный вариант - это создать всё таки куки файл. С генерировать ключ sha1(SALT1 + IP_USER + SALT2).
При попадании на авторизованные страницы, проверять на стороне сервера этот ключ.

1) Правильно ли привязывать куки к IP? или может USER_AGENT добавить?
2) И какой срок действия куки использовать? у меня на mail.ru вход всегда уже выполнен, следовательно срок там большой видать.

_____________
..Работает - не трогай!
AllesKlar
maximka787
Беседа в стиле:
Девочки, правильно ли варить борщ в кастрюле? Я вот с коллегами из Азербайджана посоветовалась, они всегда варят в казане, правда у них всегда плов получается и они изюм добавляют.
Если же все-таки варить борщ в кастрюле, изюм добавлять или лучше лавровый лист?


Авторизация - это:
1. получили из скрипта данные для логина.
2. запрос в базу.
3. сохранили значение в сессию.

Все остальное на твой вкус.
Хочешь в куки - храни в куки, хочешь юзер-агент, храни юзер-агент.
Хочешь вечные куки - ставь вечные куки, не забыв это с сервером согласовать.




_____________
[продано копирайтерам]
maximka787
ОК. Спасибо за разъяснение. И все таки, еще раз:

НАДЕЖНО ЛИ авторизовать пользователя самым простым $_SESSION['user_id'] = $row['id']; ???

Без каких либо доп проверок!
Не получится ли так, что хацкер в личном кабинете будет работать от любого ID_USER?

или это $_SESSION['user_id'] = $row['id']; уже не обойти злодею?

Зачем тогда многие советуют делать проверку по IP, если невозможно обойти проверку if(isset($_SESSION['user_id'])) { echo 'secret page'; }
??

_____________
..Работает - не трогай!
AllesKlar
Цитата
или это $_SESSION['user_id'] = $row['id']; уже не обойти злодею?

На стороне сервера это злодею не обойти.
(опускаем за скобки взлом базы или сервера перед этим)

Если украли куки, то украли вмести с ними и идентификатор сессии, и на стороне сервера стартанет эта сессия из ворованых кук.
Но это проблема не сервера, а распистяйства пользователя.

Если у тебя платежная система, то да, можешь писать в сессию юзер-агента, ip, разрешение экрана и все, что сможешь получить яваскриптом от машины. И как-только что-либо подозрительное, выкидывать "В последний раз вы логинились не с этого копьютера, мы чета ссыкуем, перелогиньтесь, плиз", как это сделано на веб-мани (бесит жутко)

Если речь об форуме, то оно тебе надо?
Возьми свой профиль браузера, скопируй его на другой комп, поменяй ip, и ты спокойно зайдешь без логина в те же одноклассники.

_____________
[продано копирайтерам]
maximka787
Цитата (AllesKlar @ 10.06.2015 - 09:32)
"В последний раз вы логинились не с этого копьютера, мы чета ссыкуем, перелогиньтесь, плиз", как это сделано на веб-мани (бесит жутко)

biggrin.gif

Да не, за своими сессиями пусть юзеры следят сами. Мне главное, чтоб злоумышленник не смог подменить свой ID на ID кого-нибудь другого и натворить делов.

В целом вопрос решен. Благодарю за поддержку.

_____________
..Работает - не трогай!
maximka787
Парни, а подскажите, соль можно ведь прописать в php скрипте как постоянное значение? кто-то генерирует соль каждый раз разную, кто-то нет. Ведь статичный вид соли по идее тоже безопасен?
$passwd = sha1('123'.$passwd.'456');


_____________
..Работает - не трогай!
AllesKlar
Цитата (maximka787 @ 17.06.2015 - 17:00)
Парни, а подскажите, соль можно ведь прописать в php скрипте как постоянное значение? кто-то генерирует соль каждый раз разную, кто-то нет. Ведь статичный вид соли по идее тоже безопасен?
$passwd = sha1('123'.$passwd.'456');

Если соль одна для всех юзеров, то это уже не соль а так.. рассольчик.

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

_____________
[продано копирайтерам]
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.