Авторизация не происходит

zarus

Хитрожопый макак
У меня свой вопрос.
Насколько оправданно использовать session_write_close() сразу после присвоения переменной. Т.е. будет ли после этого доступен массив $_SESSION, или придется открывать сессию снова - т.е. session_write... session_start(); ?
 

SiMM

Новичок
> Насколько оправданно использовать session_write_close() сразу после присвоения переменной.
Зачем? Цели оправдывают средства, а пока они неизвестны - в этой операции не видно никакого смысла.
 

zarus

Хитрожопый макак
Да задача банальна - авторизация.
Скрипт писался на заре моего изучения пхп, и сессии я не использовал.
При открытии страницы у меня все время идет запрос к базе на предмет идентификации пользователя из куков. Это же не правильно. Проще один раз авторизовать, потом проверять переменную сессии. А код вот такой:
PHP:
  $_ADM_USER = array('id'=>0,'name'=>'','mail'=>'','supreme'=>0,'support'=>0,'news'=>0,'trade'=>0);
  session_cache_limiter('nocache');
  session_start();
  if (!isset($_SESSION['ADM_VALID'])) {
    $_SESSION['ADM_VALID'] = validatecookie();
  }
  if ($_SESSION['ADM_VALID']) {
    $_ADM_USER = $_SESSION['ADM_USER'];
  }
  session_write_close();
  function validatecookie() {
    $valid = false;
    if (empty($_COOKIE['auth']) ||
        empty($_COOKIE['auth']['id']) ||
        empty($_COOKIE['auth']['cookie']))
      return $valid;
    $auth = $_COOKIE['auth'];
    $q = db_query("SELECT * FROM `".USER."` WHERE `id`='".$auth['id']."' AND `active`=1 LIMIT 1");
    if (false !== ($row = db_fetch_row($q,1))) {
      if ($auth['cookie'] == md5($row['pass'])) {
        db_query("UPDATE `".USER."` SET `lastlogindate`='".date("m.d.y.H.i.s")."', `proxy`='".get_remote_ip()."' WHERE `id`='".intval($auth['id'])."'");
        $_SESSION['ADM_USER'] = array('id'=>$row['id'],'name'=>$row['username'],'mail'=>$row['email'],
                                      'supreme'=>$row['admn_all'],'support'=>$row['admn_sup'],'news'=>$row['admn_nws'],'trade'=>$row['admn_trd']
                                     );
        $valid = true;
      }
    }
    return $valid;
  }
-~{}~ 25.11.05 12:44:

И еще бы хотелось услышать комментарий (ссылки) на счет "блокирования" сессии. Т.е. чтобы с двух компьютеров одновременно к одной и той же сессии по SID не могли обратиться.
 

SiMM

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

> Т.е. чтобы с двух компьютеров одновременно к одной и той же сессии по SID не могли обратиться.
Храни в сессии доступные параметры пользователя (IP, браузер клиента) и не допускай использования сессии при их отличии.
 

zarus

Хитрожопый макак
Автор оригинала: SiMM
Вопрос был не в том, зачем использовать сессии, а в том, зачем использовать session_write_close? При быстровыполняющихся скриптах в этом нет необходимости. По крайней мере - сложно себе представляю такие ситуации, где эта функция необходима.
Не совсем так. Часть, которую я выложил - это инклюд-заголовок. Если я в середине попытаюсь обратиться к переменной сессии, нужно ли будет использовать открытие сессии? Я использую session_write_close, так как в коде у меня возможна переадресация юзера на новую страницу через header(location...);

Автор оригинала: SiMM
Храни в сессии доступные параметры пользователя (IP, браузер клиента) и не допускай использования сессии при их отличии.
И соответственно, отсечь всех пользователей, сидящих через анонимные прокси? Т.е. я так понял, либо безопасность, либо никак.
 

SiMM

Новичок
> Я использую session_write_close
ЗАЧЕМ?

> так как в коде у меня возможна переадресация юзера на новую страницу через header(location...);
Ну и что?
PHP FAQ: Сессии. Подробное описание работы и объяснение механизма.

> И соответственно, отсечь всех пользователей, сидящих через анонимные прокси?
С какой кстати? Если прокси не меняет свой адрес каждые две минуты - никого ты не отсечёшь.
 

zarus

Хитрожопый макак
Автор оригинала: SiMM
> Я использую session_write_close
ЗАЧЕМ?

> так как в коде у меня возможна переадресация юзера на новую страницу через header(location...);
Ну и что?
PHP FAQ: Сессии. Подробное описание работы и объяснение механизма.
Читал я его, но плохо понял одно:
PHP:
session_start();
$_SESSION['var1'] = '1';
header('Location: go_away');
die;
Будет ли переменная $_SESSION['var1'] доступна в скрипте go_away, при условии, что механизм сессий работает?
Почему я задаю этот вопрос - видел в комментариях в мане по пхп сообщение о том, что если выполнить приведенный код, то записи переменной не произойдет. Или я что-то не так догнал? Или не догнал совсем? о.О

Автор оригинала: SiMM
> И соответственно, отсечь всех пользователей, сидящих через анонимные прокси?
С какой кстати? Если прокси не меняет свой адрес каждые две минуты - никого ты не отсечёшь.
Ну если в переменную сессии записать ip и информацию о браузере - то уникальности явно не получится. Да и, думаю, это тема другого разговора.
 

SiMM

Новичок
> Будет ли переменная $_SESSION['var1'] доступна в скрипте go_away, при условии, что механизм сессий работает?
Будет, если куки у пользователя включены, и не будет, если куки выключены - в FAQ это есть и даже объясняется, почему и как надо, чтобы работало всегда.
PHP:
header('Location: go_away?'.SID);
> Ну если в переменную сессии записать ip и информацию о браузере - то уникальности явно не получится
Уникальности чего? И опять же - это всего лишь дополнительная мера подстраховки, а не панацея от всех бед.
 

zarus

Хитрожопый макак
Автор оригинала: SiMM
> Будет ли переменная $_SESSION['var1'] доступна в скрипте go_away, при условии, что механизм сессий работает?
Будет, если куки у пользователя включены, и не будет, если куки выключены - в FAQ это есть и даже объясняется, почему и как надо, чтобы работало всегда.
PHP:
header('Location: go_away?'.SID);
Значит, просто сбили. Я на практике еще не пробовал, хотел сначала посоветоваться. Спасибо большое!
Автор оригинала: SiMM
> Ну если в переменную сессии записать ip и информацию о браузере - то уникальности явно не получится
Уникальности чего? И опять же - это всего лишь дополнительная мера подстраховки, а не панацея от всех бед.
Ну я думаю, подстраховываться надо тем, чтобы напрямую проверять права пользователя, там, где это нужно, а не пользоваться куками и сессиями. Скажем так, я просто хотел узнать, как защитить пользователя, от того, что его аккаунтом могут воспользоваться для корыстных целей.
Нужные мне страницы я скорее всего закрою unset($_SESSION['valid_user']); что приведет к постоянной ревалидации юзера.
Собственно, вся морока с сессиями мне нужна, чтобы уменьшить количество запросов к базе MySQL.
 
Сверху