Вы не зашли.
Главная » PHP » авторизация $_COOKIE
#71. Gemorroj Off (107)
Administrator
2012.02.11 09:09
$_COOKIE['PHPSESSID'] - лучше не использовать дефолтовое название, а ставить свое
#72. tipsun Off (19)
Moderator
2012.02.11 12:12
Код:
<?php
 
define('SESSION_NAME''SID');
session_name(SESSION_NAME);
 
if (isset($_COOKIE[SESSION_NAME])) {
    session_start();
    
    if (! isset($_SESSION['SELF'])) {
        //Запрос к БД о наличии заданной session_id()
        //PHPSESSID=d65fjsmf8kc69ee8urb1glh855
        //Можно было бы и SELECT COUNT(1) FROM `users` WHERE `PHPSESSID`='d65fjsmf8kc69ee8urb1glh855'; +- LIMIT 1;
        //Но надо, наверно, вытащить какую-нибудь важную инфу, поэтому скорее всего...
        //SELECT `uid` FROM `users` WHERE `PHPSESSID`='d65fjsmf8kc69ee8urb1glh855' LIMIT 1;
        if ($_/*Подсчет кол-ва затронутых строчек*/) {
            $_SESSION = array();
            session_regenerate_id();
            $_SESSION['SELF'] = true;
            //выплевываем данные с массива базы в массив сессии...
        } else {
            //отрубить сессию, может быть.
            $_SESSION = array();
            session_destroy();
            //$params = session_get_cookie_params();
            setCookie(SESSION_NAMEnull$_SERVER['REQUEST_TIME'] - 1);
            //Доконца не понял че там этот session_destroy(); делает.
            //Как я понял: не очищает массив сессии, и не удаляет куку.
        }
    }
}
Отредактировано tipsun (2012.02.11 13:01)
#73. Gemorroj Off (107)
Administrator
2012.02.11 13:01
да и не SID тоже, лучше подгонять под конкретный проект. на вапинете скажем, сессия SID может ставится и в блогах и на форуме. в таком случае они будут перезаписывать друг друга.
лучше называть что-то типа wapinet_blog, wapinet_forum и т.д.
#74. tipsun Off (19)
Moderator
2012.02.13 15:03
Чет не удаляется печенюха с "лисы".

Простая сессия, кука пропадает после закрытия браузера.
Чет она не удаляется. Видимо только при закрытии браузера only.
Или все-таки можно удалить?
Код:
<?php
define('SESSION_NAME''SID');
 
$_ session_get_cookie_params();
//setCookie(SESSION_NAME, null, $_SERVER['REQUEST_TIME'] - 1);
setCookie(SESSION_NAMEnull$_SERVER['REQUEST_TIME'] - 1$_['path'], $_['domain'], $_['secure'], $_['httponly']);
 
//session_set_cookie_params(null, '/', '.' . $_SERVER['HTTP_HOST'], false, true);
//session_name(SESSION_NAME);
//session_start();
 
echo $_COOKIE[SESSION_NAME];
Добавлено спустя   6 минут  39 секунд:
Все, я понял в чем дело. smile
Код:
echo '<pre>';
print_r(session_get_cookie_params());
echo '</pre>';
Отредактировано tipsun (2012.02.13 15:03)
#75. tipsun Off (19)
Moderator
2012.02.13 18:06
И зачем session_get_cookie_params() вообще нужна, если она нифига не работает...
Можно как-то о куке которая у браузера узнать побольше?
- - - -
Точнее работает, когда указано явно session_set_cookie_params() или через ini_set() наверно.
Отредактировано tipsun (2012.02.13 18:06)
#76. Gemorroj Off (107)
Administrator
2012.02.13 18:06
tipsun написал:
И зачем session_get_cookie_params() вообще нужна, если она нифига не работает...
работает в соответствии с документацией.
на серверных языках о куках особо инфы не получить. видимо.
#77. tipsun Off (19)
Moderator
2012.02.14 00:12
Код:
<?php
 
define('SLASH'DIRECTORY_SEPARATOR);
 
define('SESSION_NAME',                         'SID');
define('SESSION_LIFETIME',                    604800); //1 week/неделя
define('SESSION_PATH',                         SLASH);
define('SESSION_DOMAIN''.' $_SERVER['HTTP_HOST']);
define('SESSION_SECURE',                       false);
define('SESSION_HTTPONLY',                      true);
 
session_name(SESSION_NAME);
if (isset($_COOKIE[SESSION_NAME])) {
    session_start();
    if (! isset($_SESSION['SELF'])) {
        //Запрос к БД о наличии заданной session_id() а проще $_COOKIE[SESSION_NAME]
        //SELECT `uid` FROM `users` WHERE `PHPSESSID`='d65fjsmf8kc69ee8urb1glh855' LIMIT 1;
        $_SESSION = array(); //на всякий случай...
        if ($query_rowCount) {
            session_set_cookie_params(SESSION_LIFETIME,
                                      SESSION_PATH,
                                      SESSION_DOMAIN,
                                      SESSION_SECURE,
                                      SESSION_HTTPONLY);
            session_regenerate_id(true); //копирует инфу в новый файл + удаляет старый файл.
            $_SESSION['SELF'] = true//самоидентификация типа (есть файл или нет чтоб потом посмотреть).
            //выплевываем данные с массива базы в массив сессии...
        } else {
            session_destroy();
            setCookie(SESSION_NAME,
                      null,
                      0,
                      SESSION_PATH,
                      SESSION_DOMAIN,
                      SESSION_SECURE,
                      SESSION_HTTPONLY);
        }
    }
}
 
//echo '<pre>';
//print_r($_SESSION);
//echo '</pre>';
Добавлено спустя   8 минут  17 секунд:
Указал в параметрах куки сессии SESSION_LIFETIME из соображений, если пользователь зашел на сайт, а файла нет, то скорее всего его долго не было. А раз долго не было, а кука сохранилась, значит он нажимал на (запомнить).
Хотя может я и не прав. Время жизни файла сессии по умолчанию вроде, как помню, 1440 секунд
Отредактировано tipsun (2012.02.14 01:01)
#78. tipsun Off (19)
Moderator
2012.02.14 00:12
Ну можно довести сохранение файла сессии до 60*60*6 = 6 часов или сделать 12 часов, не знаю.
Вероятность ошибочного присвоения метки (запомнить) будет меньше, наверно...
Отредактировано tipsun (2012.02.14 00:12)
#79. tipsun Off (19)
Moderator
2012.02.14 14:02
Вроде, готово.
Код:
<?php
//+ Это можно отдельно где-то держать...
define('DS'DIRECTORY_SEPARATOR);
 
define('SESSION_NAME',                         'SID');
define('SESSION_LIFETIME',                    604800); //1 week/неделя
define('SESSION_PATH',                            DS);
define('SESSION_DOMAIN''.' $_SERVER['HTTP_HOST']);
define('SESSION_SECURE',                       false);
define('SESSION_HTTPONLY',                      true);
//- Это можно отдельно где-то держать...
include_once 'db.php'//PDO Driver
 
session_name(SESSION_NAME);
if (isset($_COOKIE[SESSION_NAME])) {
    session_start();
    if (! isset($_SESSION['SELF'])) {
        $_SESSION = array();
        $query $db->prepare("SELECT `uid` FROM `users` WHERE `session_id`=? LIMIT 1;");
        $query->execute(array($_COOKIE[SESSION_NAME]));
        if ($query->rowCount()) {
            $_SESSION['SELF'] = true;
            session_set_cookie_params(SESSION_LIFETIME,
                                      SESSION_PATH,
                                      SESSION_DOMAIN,
                                      SESSION_SECURE,
                                      SESSION_HTTPONLY);
            session_regenerate_id(true);
            $_SESSION += $query->fetch(PDO::FETCH_ASSOC);
            $query $db->prepare("UPDATE `users` SET `session_id`=:new WHERE `session_id`=:old LIMIT 1;");
            $query->execute(array(':old' => $_COOKIE[SESSION_NAME], ':new' => $_COOKIE[SESSION_NAME] = session_id()));
        } else {
            session_destroy();
            setCookie(SESSION_NAME,
                      null//Session value
                      0,    //Session lifetime
                      SESSION_PATH,
                      SESSION_DOMAIN,
                      SESSION_SECURE,
                      SESSION_HTTPONLY);
        }
    }
}
 
///*
echo '<pre>';
print_r($_COOKIE);
echo '</pre>';
//*/
Отредактировано tipsun (2012.02.16 17:05)
#80. tipsun Off (19)
Moderator
2012.02.29 16:04
В базе нужно будет помимо `session_id` сделать еще `session_expire`, а то кука удалится, а поле в базе с этим `session_id` будет активна.
Мне так кажется.
Отредактировано tipsun (2012.02.29 16:04)
Страниц: 16 7 8 9 1012 Все
Главная
WEB
PunBB Mod v0.6.2
0.018 s