Улучшенная авторизация с помощью сессий

ForJest

- свежая кровь
Улучшенная авторизация с помощью сессий

Многие делали авторизацию с помощью сессий. Меня интересует, кто какие приемы использует для более точной идентификации пользователя.
Мой пример
-----------------------
auth_func.inc.php
-----------------------
PHP:
function AuthHash()
{
   return md5(
        $_SERVER["REMOTE_ADDR"].
        (string)@$_SERVER["HTTP_USER_AGENT"].
        (string)@$_SERVER['HTTP_ACCEPT_CHARSET'].
        (string)@$_SERVER['HTTP_ACCEPT_ENCODING'].
        (string)@$_SERVER['HTTP_ACCEPT_LANGUAGE'].
        (string)@$_SERVER['HTTP_X_FORWARDED_FOR']
        );
}
--------------
login.php
--------------
PHP:
session_start();
require_once("auth_func.inc.php");
if (<новая авторизация>)
{
     $_SESSION["customer"] = array(
          "id"   => $id_customer, 
          "info"=> AuthHash());
}
if (!empty($_SESSION["customer"]["id"]) && 
    (AuthHash() == $_SESSION["customer"]["info"]))
{
     header("Location: restr.php");
     exit();
}
-----------
restr.php
-----------
PHP:
session_start();
require_once("auth_func.inc.php");
if (empty($_SESSION["customer"]["info"]) || 
    AuthHash()!=$_SESSION["customer"]["info"])
{
     Header("location: login.php");
     exit();
}
-----------------------
В общем используются возможные поля из заголовка запроса. Кто еще что использует или какие использует приемы для повышения уровня точности авторизации?
Кто что может сказать плохого о моем способе?
Использует ли кстати кто-нибудь
session.referer_check ?

P.S. наверное нужно было постить в секьюрити. Сорри.
 

Alkinoy

Guest
Я еще проверяю насколько давно заходил пользователь последний раз, и если больше 10 мин - убиваю сессию и отправляю на форму логина. Это на случай - человек отошел, браузер не закрыл, а кто то попробует с его компа зайти.
 

ForJest

- свежая кровь
Alkinoy, спасибо, но меня интересует именно в ключе идентификации - чтобы не было промашек.
 

Anton Poletayev

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

Bill Gates

Guest
Вообще-то, эта "фича" называется session.gc_maxlifetime и настраивается в php.ini или других местах, его заменяющих.
 

Bill Gates

Guest
ForJest
Непонятна сама постановка вопроса.
От двух компьютеров-близнецов, стоящих за непрозрачной корпоративной проксей, такая защита не спасет. и любая другая, построенная на том же принципе - тоже.
Ты уж определись, что тебе надо защищать, и принимай более адекватные меры.
Если действительно нужна серьезна защита - то ssl.
А это... ну чуть надежнее, чем просто отслеживание по IP.
 

ForJest

- свежая кровь
Тов. Вилли Воротов. Никто не говорил о защите.
Я говорю об идентификации.
Можешь пояснить что значит "непрозрачная корпоративная прокся"? Эта страшная штука не позволяет принимать куки?
 

ForJest

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

Bill Gates

Guest
Для идентификации браузера вообще хватает стандартных способов - кук и урла.
И если их прокся путает куки, то тут вряд ли что-то поможет.

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

Anton Poletayev

Guest
Автор оригинала: Bill Gates
Вообще-то, эта "фича" называется session.gc_maxlifetime и настраивается в php.ini или других местах, его заменяющих.
Спасибо, я в курсе :D Я не про это, а про то, что пользователю надо давать возможность выбора - по умолчаню убивать через 10 минут, а кому это не нравится - жизнь вечную даровать.
 

Bill Gates

Guest
Вечную жизнь сессиям даровать неправильно. Это даже дети знают.
тем более ,что твоя вечная жизнь все равно зависит от времени жезни сессии и куки - а то, что ты в сессию напишешь, может сократить жизнь сессии, но увеличить - не сможешь при всем желании.

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

Антон, время жизни сессии - это вопрос не прихоти пользователя, а безопасности.

И, сдается мне, ты ты не очень понимаешь - что такое время жизни сессии...
 

Anton Poletayev

Guest
Я просто считаю, что _возможность_ регулировки задержек logout'а можно доверить пользователю. Как мусор собирать - вопрос другой, и logout можно делать и не через сборку мусора. Почему мы берёмся за пользователя жестко решать, что ему стоит, а что нет?

Просто слегка утомляют такие фокусы, когда переключился в соседнее окно, прочел письмо, вернулся, а там уже всё проэкспайрилось и надо перелогиниваться. Т.е. кому-то нужна функциональность сброса, а кому-то и нет, причем категорически. Т.е. физический доступ посторонних лиц не волнует человека - его просто не может быть, а для своей работы ему достаточно наличия кнопки "logout" или сброса по закрытию броузера. Так пусть в настройках своего профайла человек имеет возможность отключить авто-логаут.

Тем более, что gc_maxlifetime не та фича, которой можно доверить такую тонкую операцию, как logout :)

Note:
If you are using the default file-based session handler, your filesystem must keep track of access times (atime). Windows FAT does not so you will have to come up with another way to handle garbage collecting your session if you are stuck with a FAT filesystem or any other fs where atime tracking is not available.
 

Bill Gates

Guest
Ну, последнее является лишь следствием того, что if you are using PHP under Windows you will constantly encounter various troubles.

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

"отключить автологаут" - это значит поставить куку с автологином.

И никакие фокусы не будут утомлять.
Надо просто понимать, что такое сессии, и что надо делать с их помощью, а что делать - не надо.

Впрочем, я вижу, ты малый упертый, не по уровню знаний самоуверенный (в народе таких кличут ламерами), переубеждать таких - только время тратить.
Ходи темнотой и дальше.
 

ForJest

- свежая кровь
Какой штиль!
Ну в общем насколько я понял предложенный мной способ является оптимальным.
 

Bill Gates

Guest
Я считаю, что все эти извращения абсолютно бессмысленны.
 

ForJest

- свежая кровь
Извращение - это когда есть общепринятая база, подтвержденная обычаями, религиозными нормами и законодательством.
Пару фраз я вроде как выловил из этого поста.
Но session.referer_check никто не использует. А жаль - хотелось бы услышать как решаются проблемы с заходом на первую страницу
 

Anton Poletayev

Guest
[пожимает плечами]
извини, друг, но ты просто банальный анонимный форумный хам
[отходит в сторону]
 

Bill Gates

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

в php.ini вроде же, ведь ясно написано - почему никто не использует referer_check ?

А какие проблемы бывают с заходом на первую страницу?
Очень интересно
 

ForJest

- свежая кровь
И дейсвительно - это я не подумавши. Сессия как раз стартует если приход на первую страницу. А что в твоем php.ini написано? В моем не написано ничего по этому поводу.
Насколько я понимаю, это удобная автоматизация того что написано в древней но все же актуальной доке
http://phpclub.net/tutor_red.phtml?tutor_id=30
 
Сверху