ФорумПрограммированиеPHP для идиотов → Сессии (обобщая)

Сессии (обобщая)

  • pyhtelkin

    Сообщения: 103 Репутация: N Группа: Кто попало

    Spritz 30 мая 2008 г. 18:19

    Сессии я уже использовал, но хочется написать себе один модуль по работе с сессиями, чтобы потом использовать только его. Наполеоновски наметил себе: не открывать сессии всем попало, делать проверку кук, при запрещенных куках передавать с помощью get, если гет - привязка сессии к ip и времени, экранировать содержимое переменных … в идеале хочется преодолеть дефолтное PHPSESSID чтоб работало конфиго-независимо. А найти свою потерянную сессию - было бы вообще фантастикой. Впечатляюсь рапидшарой. Немцы, ё!

    Материал короче потянет на статью, но с моими познаниями процесс потянет на целый год …
    Что еще, посоветуете что-нибудь из личного опыта?
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 30 мая 2008 г. 18:27, спустя 8 минут 27 секунд

    делать проверку кук, при запрещенных куках передавать с помощью get

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

    если гет - привязка сессии к ip

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

    преодолеть дефолтное PHPSESSID

    session_name();

    экранировать содержимое переменных

    В смысле? Пользователи не имеют прямого доступа к сессии, в ней будет только то, что вы в нее запишете. А проверять нужно значение всех переменных, а не только тех, которые будут записаны в сессию.
  • pyhtelkin

    Сообщения: 103 Репутация: N Группа: Кто попало

    Spritz 30 мая 2008 г. 18:39, спустя 12 минут 17 секунд

    > Как вы собираетесь установить, включены ли куки при первом запуске сценария?
    Видимо вас смутило слово модуль. Под модулем я подразумевал не костяной набор кода, а скорее набор последовательностей которые использовать выборочно. Так на странице логина при ее загрузке ставится кука, при появлении postа уже включаются проверки.

    > А если куки включены, почему бы не делать привязку по IP? Куку подменить не сложнее, чем гет-параметр.
    Тоже поясню. Не во всех процессах нужна паранойя. Например если существует какая-то многошаговая подача, а у человека на модеме рвется связь (представьте, они не вымрут), удалять сессию чтоли? В каких-то более ответственных частях конечно использовать и IP, но ведь тоже существуют нюансы …

    > session_name();
    Да, спасибо, уже читал. Но я еще (образно) как слона в тумане ощупываю, общая картина никак не складывается. Плюс я тугодум. Короче много вопросов относительно сессий еще остается …

    > экранировать содержимое переменных
    Нет, я про экранирование слешами всяких кавычек. Я правда до конца не уверен что так нужно хранить В СЕССИЯХ, просто так видел. Информацию собираю.
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 30 мая 2008 г. 19:26, спустя 47 минут 5 секунд

    > А если куки включены, почему бы не делать привязку по IP? Куку подменить не сложнее, чем гет-параметр.
    Тоже поясню. Не во всех процессах нужна паранойя. Например если существует какая-то многошаговая подача, а у человека на модеме рвется связь (представьте, они не вымрут), удалять сессию чтоли? В каких-то более ответственных частях конечно использовать и IP, но ведь тоже существуют нюансы …

    А если у бедного пользователя отключены куки и рвется связь? Ему придется начинать все сначала. Я думаю, что привязку по IP нужно или использовать в любом случае, или не использовать вообще (имеются в виду разные методы передачи SID'a, разумеется, а не разные задачи).

    Нет, я про экранирование слешами всяких кавычек.

    Экранирование нужно преимущественно только при работе с БД. И его нужно выполнять всегда, неважно, откуда пришли данные, из сессии или еще откуда.

    Я правда до конца не уверен что так нужно хранить В СЕССИЯХ, просто так видел.

    В зависимости от задачи =) Банальный пример — корзина инет-магазина. В сессии, как правило, нужно и достаточно хранить ID товаров и совсем не нужно тягать в сессии описания, изображения и т. п.
  • pyhtelkin

    Сообщения: 103 Репутация: N Группа: Кто попало

    Spritz 30 мая 2008 г. 19:51, спустя 24 минуты 27 секунд

    > А если у бедного пользователя отключены куки и рвется связь? Ему придется начинать все сначала.

    Пожалуйста разъясните. Мне казалось что GET (остатки в адресной строке и комбинация с встройкой имени сессии "в страницу") как раз от этого спасает, конечно если кука не успела испортиться. До сих пор мне казалось что шанс продолжить свою оборванную сессию всетаки есть …

    P.S. Еще обращал внимание, серьезные процессы создают SESSIONBAK, только как его подобием манипулировать еще ума не приложу. А точнее, в копии даже смысла не вижу. Хотя … она видимо как раз для обрыва, при разрешенных куках.
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 30 мая 2008 г. 20:15, спустя 23 минуты 59 секунд

    Пожалуйста разъясните. Мне казалось что GET (остатки в адресной строке и комбинация с встройкой имени сессии "в страницу") как раз от этого спасает

    Спасает, но вы же хотите сделать привязку по ип, если гетом передается =)
    Да и если кукой передается, то сессия продолжиться. Может, вам нужно тут почитать? =)
    http://phpfaq.ru/session — изучайте.
  • pyhtelkin

    Сообщения: 103 Репутация: N Группа: Кто попало

    Spritz 30 мая 2008 г. 20:23, спустя 8 минут 16 секунд

    Согласен. Сам себе противоречу. Видимо забыл добавить что IP при гетах обязателен в ответственных процессах типа авторизации.

    Вот именно поэтому, собирание "всего этого" в единое просто угнетает …
  • pyhtelkin

    Сообщения: 103 Репутация: N Группа: Кто попало

    Spritz 10 июня 2008 г. 11:51, спустя 10 дней 15 часов 28 минут

    Подскажите, можно ли/как заставить session_start работать в функции? Хочется вызывать функцию, в которой уже будет необходимый функционал по проверке и тп. Если все упростить то:

    function sessiya()
    {
    session_name('SESSION');
    session_start();
    }

    В таком виде она работает, но приводит к неадекватному поведению сценария.
  • md5

    Сообщения: 11960 Репутация: N Группа: в ухо

    Spritz 10 июня 2008 г. 12:43, спустя 52 минуты 5 секунд


    Подскажите, можно ли/как заставить session_start работать в функции? Хочется вызывать функцию, в которой уже будет необходимый функционал по проверке и тп. Если все упростить то:

    function sessiya()
    {
    session_name('SESSION');
    session_start();
    }

    В таком виде она работает, но приводит к неадекватному поведению сценария.
    к какому поведению?
    все умрут, а я изумруд
  • pyhtelkin

    Сообщения: 103 Репутация: N Группа: Кто попало

    Spritz 10 июня 2008 г. 12:58, спустя 15 минут 2 секунды

    Вы не поверите, но при истользовании в элементарной конструкции

    if (был пост)
    {
    проверка содержимого, определение ошибок

    if (все ok)
    {
    function sessiya();
    $_SESSION['lalala']='ляляля';
    редирект
    }
    }
    else
    {
    не пост
    }

    <form>
    форма, отправить
    </form>


    Варианта 'пост' вообще не случается 8-\ заменяешь на session_start - случается. Стартуешь сессию функцией (даже как указал) - каждый раз работает как простой показ страницы, без отправки.
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 10 июня 2008 г. 13:00, спустя 2 минуты 11 секунд

    а как ты проверяешь что пост был?
  • pyhtelkin

    Сообщения: 103 Репутация: N Группа: Кто попало

    Spritz 10 июня 2008 г. 13:08, спустя 7 минут 13 секунд


    if (isset($_POST['submit'])
    {
    был
    }
    else
    {
    небыл
    }


    т.е. по конкретной кнопке.
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 10 июня 2008 г. 13:13, спустя 5 минут 29 секунд

    так я понял
    у тебя все на одной странице

    кейс 1
    первый раз смотришь страницу
    - не пост
    - заполняешь форму
    - отправляешь

    кейс 2
    второй раз смотришь страницу
    - пост
    - сессия стартует
    - тебя релдиректит

    кейс 3
    тебя отредиректило опять на туже страницу
    - не пост
    - сессия не стартует
    - кейс 1
  • pyhtelkin

    Сообщения: 103 Репутация: N Группа: Кто попало

    Spritz 10 июня 2008 г. 13:22, спустя 9 минут 5 секунд

    Да, именно так все и случается. Только при старте сессии внутри функции, варианта пост магическим образом не случается вообще никогда, даже когда он реально был. При использовании session_start все работает, а если она (даже одна) заключена в функцию - нет. А решения как объявить ее "глобальной" =) не знаю.
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 10 июня 2008 г. 14:26, спустя 1 час 3 минуты 31 секунду

    премию мне за проницательность

    if (был пост){

    echo $_SESSION['lalala'];

    if (все ok) {

    }
    }


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

    PS вот тебе еще пример для размышления http://mabp.kiev.ua/content/2007/06/21/mysql_session_manager/

Пожалуйста, авторизуйтесь, чтобы написать комментарий!