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

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

  • pyhtelkin

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

    Spritz 30 мая 2008 г. 7:19

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

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

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

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

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

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

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

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

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

    session_name();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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


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

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

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

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

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

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


    if (isset($_POST[&#39;submit&#39;])
    {
    был
    }
    else
    {
    небыл
    }


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

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

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

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

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

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

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

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

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

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

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

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

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

    if (был пост){

    echo $_SESSION[&#39;lalala&#39;];

    if (все ok) {

    }
    }


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

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

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