Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Авторизация с помощью куков
Форумы портала PHP.SU » » HTTP и PHP » Авторизация с помощью куков

Страниц (1): [1]
 

1. Itan - 17 Августа, 2011 - 16:05:46 - перейти к сообщению
Здравствуйте! Я немного не понимаю, как работает авторизация с куками.

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

Только я не пойму какой кеш надо вписывать в куку и в базу для сравнения. Там нужна какая-то "соль" - её нужно отдельно хранить или генерировать после каждой успешной авторизации и перезаписывать в куку и в базу? И как это вообще работает? Объясните попроще, пожалста.
2. LIME - 17 Августа, 2011 - 16:16:50 - перейти к сообщению
Itan пишет:
Вот как я вижу
ненадо видеть ))
тема избита до немогубольше
гугл
3. Itan - 17 Августа, 2011 - 16:24:40 - перейти к сообщению
Да везде по-разному. У меня в одной книге вообще без соли, во второй непонятно. В инете искал, в одном примере постоянная строка хэшируется вместе с логином, во втором - генерируется каждый раз.
4. Itan - 18 Августа, 2011 - 07:23:24 - перейти к сообщению
Я вот вроде все понял, как это работает.
Только непонятно, как реализовать авторизацию, если два юзера используют один аккаунт, например, корпоративный почтовый ящик. В инете не смог найти.

Например человек А залогинился на сайте. Ему в куки ушла строка случайного хэша; эта же строка ушла в базу, чтобы потом был "автологин".

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

После этого челоек А при переходе на другую страницу автоматически кикается, т.к. у него не совпадает хеш в куках с хешом в базе.

Как можно решить эту проблему?
5. PATCH - 18 Августа, 2011 - 07:36:47 - перейти к сообщению
а не проще ли хранить пароль зашифрованый? и при авторизации сравнивать вводимые поля по алгоритму шифрования?
6. illy - 18 Августа, 2011 - 09:00:51 - перейти к сообщению
Чё вы мутите опять Ха-ха
Зарегился - добавил в базу логин+зашифрованный пароль
Залогинился - в куки добавился логин и зашифрованный пароль
Зашёл на страницу - проверка если логин и пароль из куков есть в базе то всё ок.
иначе попросить залогиниться
7. Itan - 18 Августа, 2011 - 13:31:26 - перейти к сообщению
Дак как-то не хочется передавать хэш пароля в куки. А такая схема как?:

Таблица в БД:
id | login | password | hash | string

Файл salt.php содержит какую-то определенную строку, сделанную заранее.

При регистрации юзера генерируем случайную строку и записываем в string.

Затем после успешной аутентификации подключаем salt.php и делаем хэш(string.salt). И записываем этот хэш в базу в столбец hash. И в куки отправляем хэш.

И на странице, где нужна проверка авторизации делаем так:
подключаем salt.php
берем из базы hash и string.

если хэш(string.salt) != хэшу из кук, то чистим куки и пересылаем юзера на форму логина, иначе показываем нужную инфу.

Как такая схема? Или бред параноика? Улыбка
8. White - 18 Августа, 2011 - 13:59:54 - перейти к сообщению
Itan пишет:
Как такая схема? Или бред параноика?
ну и чего вы добились этим?
точно так же можно было бы генерировать случайную строку, и каждый раз записывать ее в базу и в куки, а потом сверять и перезаписывать.
Itan пишет:
а потом на всех сценариях писать session_start

зачем вам эти пляски с бубном если вы все-равно используете сессии? не проще ли записать все данные о юзере в сессию при авторизации, а потом проверять существование сессии?
9. Itan - 18 Августа, 2011 - 14:20:35 - перейти к сообщению
Цитата:
генерировать случайную строку, и каждый раз записывать ее в базу и в куки


Не пойдет. А если 2 человека зайдут по одним логином с разных компьютеров? например, на корпоративную почту. У того, кто первый зашел сравнение строк из кук и базы будет давать false === кик. Так не надо.

Цитата:
не проще ли записать все данные о юзере в сессию


Разве сессии не закрываются после закрытия браузера? Мне нужно, чтобы человек мог находиться под своим логином только 15 минут, а потом ре-логин.
10. Itan - 18 Августа, 2011 - 18:05:35 - перейти к сообщению
Во, я придумал как надо сделать!

Есть salt.php, который находится выше корня сайта. В нем строка.

Когда чел регается, то в базу идет его sha1(sha1(salt.password.salt))

При авторизации:
    очищаем введенный пасс и логин от мусора (на всякий случай)

    Хэшируем введенный пасс с солью: sha1(sha1(salt.password.salt))

    Сравниваем с базой


Если сравнение дает false, то доступ запрещен.
Если true, то:
    устанавливаем куки: ID юзера и Хэш пароля с солью

И чтобы снизить нагрузку на базу, устанавливаем сессию с Хэшем пароля из базы.

На каждой странице делаем проверку:
PHP:
скопировать код в буфер обмена
  1. If (установлена сессия) {
  2.         if (хэш из кук == содержимому сессии) (
  3.                 то продолжаем авторизацию, показываем *секретное* содержимое
  4.         } else {
  5.                 запрет на просмотр содержимого, переадресация на логин форму
  6.         }
  7. } else {
  8.         #Если сессия пустая
  9.         Подключаемся к базе, берем хэш пароля
  10.         Если хэш из куков совпадает с хэшом в базе, то
  11.                 устанавливаем сессию с хэшем пароля
  12. }


Как думаете, такая защита сойдет для аутентификации?
(Добавление)
Таким образом, если хакер взломает базу, то подставить хэш не сможет, потому что не знает, как он получился. (Правда, он может испортить мою базу, но это ругая тема.)

А от стыривания куков можно сделать привязку к IP - мне все равно нужна авторизация только на 15 минут.

 

Powered by ExBB FM 1.0 RC1