Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Корректная работа с сессией, Слежение за пользователями онлайн 
:(
    Опции темы
tikitiki
Дата 20.11.2007, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 10.5.2005

Репутация: нет
Всего: нет



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

И что только не делал. Придумал один способ нестандартный-изменил текст программы-получилось,но зачем он нестандартный нужен!!! Мне советовали редирект применять на старницу какую-нибудь. Пробовал тоже. Но это же не избавляет от того, что пользователь нажмёт кнопку назад и опять получится тот же результат.
Как редирект использовать для правильного обновления страниц-разобрался, хотя к вопросу видимо это не имеет отношения. Я имею ввиду-чтоб данные повторно не отправлялись при отправке формы, например.
Последняя идея мне пришла в голову-хранить информацию о пользователях(логины-они же уникальные) в бд(использую mysql), а также вход и выход в полях бд для данного логина. Тогда при переходе на предыдущую страницу проверяем из бд делал ли выход пользователь с таким логином и если да, то показываем пустую страницу, например. Или лучше на главную страницу переправить. Данный метод видимо сработает, но я его полностью не протестировал пока. Применяют ли данный метод на самом деле и нужно ли его применять, если хочешь получить профессиональный сайт?
И как же всё-таки на самом деле поступают в данном случае пофессионалы?
Модераторам: это один вопрос, состоящий из небольших подвопросов.



--------------------
PM   Вверх
Anarki
Дата 21.11.2007, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 14.3.2005

Репутация: 1
Всего: 11



А при выходе сессия правильно уничтожается (сессия хранится на стороне сервера, а не у клиента) ? Куки бы тоже пользователям удалить не мешало бы. И там, где товар добавляется, да и вообще на всех страницах должна стоять проверка на какие-то данные сессии, что пользователь авторизирован. Если он назад нажмет то может форма у него и появится(из кеша браузера), но добавить он ничего не сможет или в этом и есть вопрос, чтобы вообще не показывать предыдущую страницу человеку, если он уже сделал выход? Решение такого врядли есть общее, потому как страницы браузер в кеш сохраняет и пользователь работает с локальной страницей. Можно попробовать кеширование отключить
Код

        header("Expires: Thu, 19 Feb 1998 13:24:18 GMT");
        header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
        header("Cache-Control: no-cache, must-revalidate");
        header("Cache-Control: post-check=0,pre-check=0");
        header("Cache-Control: max-age=0");
        header("Pragme: no-cache");

в начало скрипта

Цитата

Последняя идея мне пришла в голову-хранить информацию о пользователях(логины-они же уникальные) в бд(использую mysql), а также вход и выход в полях бд для данного логина. Тогда при переходе на предыдущую страницу проверяем из бд делал ли выход пользователь с таким логином и если да, то показываем пустую страницу, например. Или лучше на главную страницу переправить. Данный метод видимо сработает, но я его полностью не протестировал пока. Применяют ли данный метод на самом деле и нужно ли его применять, если хочешь получить профессиональный сайт?

Можно вполне обойтись сессиями.
В БД разве что хранят привилегии пользователей, пароли и какие-то ID, чтобы не было пароля в cookie, а только ID

Это сообщение отредактировал(а) Anarki - 21.11.2007, 08:19


--------------------
PM WWW   Вверх
tikitiki
Дата 21.11.2007, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 10.5.2005

Репутация: нет
Всего: нет



Просто невероятно.

Цитата(Anarki @  21.11.2007,  13:12 Найти цитируемый пост)
И там, где товар добавляется, да и вообще на всех страницах должна стоять проверка на какие-то данные сессии, что пользователь авторизирован.


Вот проверку такую я как раз на всех страницах делаю и проверял и по идентификатору сессии, и по логину пользователя (в отдельности, а не вместе).
И ещё может как. Но всё равно проблема существовала и существует.
Приведу пример моих действий:
1) Ближе к началу программы (стараюсь вообще в начале)
Код

session_start(); 

далее может через несколько строк
проверку делаю например так
Код

if (isset($_POST['ses_login'])){
$sess_login=$_POST['ses_login'];
}
if (isset($sess_login)){
//echo 'isset($sess_login)';
}
if (!isset($_SESSION['login_session'])){
//echo '  login_session';
if (!isset($sess_login)){
//session_register("login_session");
//echo 'login_session'.$_SESSION['login_session'];
//echo '  pass';
//session_register("login_session");
exit();
}
}

А в скрипте для входа пользователя регистрирую переменную сессии и присваиваю ей логин пользователя из бд:
Код

session_register("session_login");
$_SESSION['session_login']=$login; 


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


--------------------
PM   Вверх
tikitiki
Дата 22.11.2007, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 10.5.2005

Репутация: нет
Всего: нет



Извиняюсь. Там выше участки программы получились не связанные, но на самом
деле были связаны. Переменная session_login у меня в другом скрипте приняла название login_session. Но это можно не считать за ошибку, т.к. я её видел и исправлял.
Видимо всё-таки дело не совсем в этих ошибках, а в чём-то другом-для меня пока не постижимом.
Цитата(Anarki @  21.11.2007,  13:12 Найти цитируемый пост)
В БД разве что хранят привилегии пользователей, пароли и какие-то ID, чтобы не было пароля в cookie, а только ID

Понятно. Но логины видимо можно хранить тоже. Читал вроде, что логины зашифрованные по крайней мере md5, вполне можно хранить в бд. А вход и выход-я так понял-не надо хранить.
Так в чём же может быть проблема всё-таки?

Добавлено через 11 минут и 6 секунд
Цитата(Anarki @  21.11.2007,  13:12 Найти цитируемый пост)
А при выходе сессия правильно уничтожается 

По-моему правильно. Делаю так:
Код

$sess_name=session_name();
$_SESSION = array();
unset($_COOKIE[session_name()]);
session_destroy();


Цитата(Anarki @  21.11.2007,  13:12 Найти цитируемый пост)
Можно попробовать кеширование отключить

Можно попробовать. Но это, если хочешь пустую страницу получить, когда пользователь вышел. А если всё-таки попробовать, то поможет ли это избавить от повторной отправки формы?


--------------------
PM   Вверх
tikitiki
Дата 24.11.2007, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 10.5.2005

Репутация: нет
Всего: нет



Более кратко выражу свою проблему. Может ли скрипт при локальном тестировании в win выдавать такую ошибку, а на сервере *nix исправно себя вести? И часто ли поведение скрипта на локальном пк отличается от поведения на хорошем платном хостинге? 
И хотелось бы очень увидеть  маленький, но правильный пример проверки авторизации пользователя при входе на страницу. Может мои проблемы будут решены.


--------------------
PM   Вверх
Anarki
Дата 25.11.2007, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 14.3.2005

Репутация: 1
Всего: 11



Цитата(tikitiki @  24.11.2007,  19:34 Найти цитируемый пост)
Может ли скрипт при локальном тестировании в win выдавать такую ошибку, а на сервере *nix исправно себя вести?

Какую? Показ всех ошибок включен? 
Выставить 
display_errors = On
error_reporting = E_ALL
и смотреть, может он что-то не может сделать с сессией
Цитата(tikitiki @  24.11.2007,  19:34 Найти цитируемый пост)
И часто ли поведение скрипта на локальном пк отличается от поведения на хорошем платном хостинге? 

Да, от разницы в версиях php,от его настроек, от включенного сейфмода, от того, привязан ли локальный скрипт к особенностям ОС и т.д.


Это сообщение отредактировал(а) Anarki - 25.11.2007, 11:33


--------------------
PM WWW   Вверх
Anarki
Дата 25.11.2007, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 14.3.2005

Репутация: 1
Всего: 11



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

<?php
session_start();
if (!isset($_SESSION['id'])) {
    if (!isset($_POST['submit'])) {
        // show login form
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">
Login:&nbsp;<input type="text" name="login">
<input type="submit" name="submit" value="GO">
</form>
<?php
    } else {
        $_SESSION['id'] = $_POST['login'];
        header('Location: '.$_SERVER['PHP_SELF']); // редирект ибо по другому нельзя из-за структуры приложения этого :), чтобы не показывать пустую страницу
        exit();
    }
} else {
    $action = isset($_GET['action']) ? $_GET['action'] : '';
    if ($action == 'form') {
        if (isset($_POST['submit'])) {
            echo 'Товар '.$_POST['tovar'].' добавлен <a href="'.$_SERVER['PHP_SELF'].'">На главную</a>&nbsp; <a href="'.$_SERVER['PHP_SELF'].'?action=logout">Выход</a>';
        } else {
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>?action=form">
<input type="text" name="tovar">
<input type="submit" name="submit" value="Add to cart">
</form>
<a href="<?php echo $_SERVER['PHP_SELF'] ?>">На главную</a>
<?php        
        }
    } elseif ($action == 'logout') {
        $_SESSION = array();
        if (isset($_COOKIE[session_name()])) unset($_COOKIE[session_name()]);
        session_destroy();
        header('Location: '.$_SERVER['PHP_SELF']); // редирект, чтобы не было повторной отправки формы да и чтобы не показывать пустую страницу
        exit();
    } else {
        echo ' <a href="'.$_SERVER['PHP_SELF'].'?action=form">Форма</a>&nbsp; <a href="'.$_SERVER['PHP_SELF'].'?action=logout">Выход</a>';
    }
}
?>


Это сообщение отредактировал(а) Anarki - 16.12.2007, 17:30


--------------------
PM WWW   Вверх
tikitiki
Дата 30.11.2007, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 10.5.2005

Репутация: нет
Всего: нет



Anarki, спасибо огромнейшее за пример!!  smile 
Отвечаю повышением твоей репутации конечно.
В примере всё понятно.
Но на всякий случай уточнить бы надо. Пример я так понял можно считать за полноценный скрипт, который можно использовать как есть.
Но вопрос один конкретный у меня остался: $_SESSION['id'] - везде в скрипте подразумеваем  - используется для хранения логина, введённого через форму методом POST($_POST['login'])?
И менее важный вопросик: методы GET и POST так и используем наравне в данном скрипте? Я в хорошем толмуте по php известных авторов читал, что GET почти не используется в современных скриптах по причине безопасности и может ещё каким.
Ещё раз спасибо.  smile 



--------------------
PM   Вверх
Anarki
Дата 30.11.2007, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 14.3.2005

Репутация: 1
Всего: 11



Цитата(tikitiki @  30.11.2007,  03:42 Найти цитируемый пост)
$_SESSION['id'] - везде в скрипте подразумеваем  - используется для хранения логина, введённого через форму методом POST($_POST['login'])?

Да. 

Цитата(tikitiki @  30.11.2007,  03:42 Найти цитируемый пост)
И менее важный вопросик: методы GET и POST так и используем наравне в данном скрипте? Я в хорошем толмуте по php известных авторов читал, что GET почти не используется в современных скриптах по причине безопасности и может ещё каким.

Для передачи форм? На самом деле совсем чуть усложняет жизнь злоумышленникам, если они захотят поискать дыры в скрипте. Т.к. тут нужно еще HTML код формы смотреть, но не более.
Метод GET для форм может применятся чтобы передавать 1-2 параметра скрипту, например поисковая форма, там очень часто используется метод GET.
Наверное правильней мне было бы сделать так: сделать новое поле 
Код

<input type="text" name="action" ...

и убрать из action формы строку запроса. А в скрипте получать action из $_GET, либо пытаться получить его из $_POST, если в $_GET нет action.



--------------------
PM WWW   Вверх
tikitiki
Дата 1.12.2007, 03:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 10.5.2005

Репутация: нет
Всего: нет



Anarki, спасибо. 
Попробую применить.


--------------------
PM   Вверх
tikitiki
Дата 10.12.2007, 04:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 10.5.2005

Репутация: нет
Всего: нет



Anarki, если прочитаешь, то ответь. Я скрипт твой отдельно в файле тестировал. Но первый редирект от начала скрипта по-моему не совсем на своём месте стоит. Или не знаю в чём дело. Но скрипт не всё делает так как надо. Для того, чтоб увидеть ссылки на форму и на выход-надо обновлять страницу(если убрать первый редирект) и т.д.


--------------------
PM   Вверх
Anarki
Дата 16.12.2007, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 14.3.2005

Репутация: 1
Всего: 11



Первый редирект стоит верно. Т.к. отправили форму - выполнили перенаправление: Установилась переменная сессии id, перенаправление, проверка существует ли id в $_SESSION, если да,то начал работать блок приложения с выводом формы. 

Вообщем я переписал кое - что, без редиректа теперь работает.
Код

<?php
session_start();
if (!isset($_SESSION['id'])) {
    if (!isset($_POST['submit'])) {
        // show login form
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">
Login:&nbsp;<input type="text" name="login">
<input type="submit" name="submit" value="GO">
</form>
<?php
        exit(); // вывели форму логина и завершили приложение
    } else {
        $_SESSION['id'] = $_POST['login'];
    }
}
$action = isset($_GET['action']) ? $_GET['action'] : '';
if ($action == 'form') {
    if (isset($_POST['submit'])) {
        echo 'Товар '.$_POST['tovar'].' добавлен <a href="'.$_SERVER['PHP_SELF'].'">На главную</a>&nbsp; <a href="'.$_SERVER['PHP_SELF'].'?action=logout">Выход</a>';
    } else {
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>?action=form">
<input type="text" name="tovar">
<input type="submit" name="submit" value="Add to cart">
</form>
<a href="<?php echo $_SERVER['PHP_SELF'] ?>">На главную</a>
<?php        
    }
} elseif ($action == 'logout') {
    $_SESSION = array();
    if (isset($_COOKIE[session_name()])) unset($_COOKIE[session_name()]);
    session_destroy();
    header('Location: '.$_SERVER['PHP_SELF']); // редирект, чтобы не было повторной отправки формы да и чтобы не показывать пустую страницу
    exit();
} else {
    echo ' <a href="'.$_SERVER['PHP_SELF'].'?action=form">Форма</a>&nbsp; <a href="'.$_SERVER['PHP_SELF'].'?action=logout">Выход</a>';
}
?>

Всё ли понятно?



--------------------
PM WWW   Вверх
Feldmarschall
Дата 16.12.2007, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: -2
Всего: 32



Забавный топик
PM   Вверх
tikitiki
Дата 16.12.2007, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 330
Регистрация: 10.5.2005

Репутация: нет
Всего: нет



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

Добавлено через 11 минут и 19 секунд
Anarki, код понятен. Надо протестировать. Да и первый код был понятен. Почему-то не протестировался нормально.


--------------------
PM   Вверх
Feldmarschall
Дата 16.12.2007, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: -2
Всего: 32



Сначала по вопросам tikitiki.
Судя по описанию, твоя проблема, насколько я понимаю, состоит в том, что ты не проверяешь - а зарегистрирован ли у тебя пользователь, который кладет товар в корзину (хотя, вообще-то, в корзину должны мочь класть как раз, анонимы, но пока предволожим, что только авторизованные пользователи)
То есть, нету проверки, как у Anarki, на if (!isset($_SESSION['id'])) {
только этим можно объяснить, что у тебя программа продолжает что-то добавлять после убивания сессии.

Ну, или тем, что сессию ты не убиваешь. но здесь я хочу поговорить о второй твоей ошибке. 
Ты описываешь только то, что сделал, напимер - session_destroy();
А как ты проверил результат - ни слова.
Но ведь программа не всегда работает так, как хочет автор!
Поэтому все свои действия налдо проверять.
В твоем случае - открыть другую страницу и попробовать вывести содержимое сессии.

Теперь по мелочи.
Если ты думаешь, что кодом unset($_COOKIE[session_name()]); ты уничтожаешь куки, то тебе надо хорошенько подтянуть начальный курс веб-программирования, протокол HTTP и основы взаимодействия браузера с сервером.
Как минимум - почитать документацию по http://php.net/setcookie
а удаление переменной в PHP скрипте смысла никакого не имеет. Эта переменная все равно через долю секунды исчезнет, так что unset($_COOKIE[session_name()]); - код совершенно бессмысленный.

Функцию session_register нельзя использовать. она устарела. Код 
session_register("session_login");
$_SESSION['session_login']=$login; 
вообще не имеет смысла. надо писать только вторую строчку. И пользоваться только массивом $_SESSION, как это делает Anarki.

Цитата(tikitiki @  21.11.2007,  20:08 Найти цитируемый пост)
 Мне бы добиться, чтоб формы после выхода пользователя не отправляли данные снова.


Этого добиться невозможно.
Твой скрипт должен не обрабатывать такую форму. а запретить посылать форму нельзя.

Цитата(tikitiki @  22.11.2007,  14:37 Найти цитируемый пост)
Понятно. Но логины видимо можно хранить тоже. Читал вроде, что логины зашифрованные по крайней мере md5, вполне можно хранить в бд.


Логин, разумеется, хранят в базе. Anarki просто забыл его написать.
MD5 - это не шифр, и логин этой функцией не обрабатывают. обрабатывают, иногда - пароль.

Цитата(tikitiki @  30.11.2007,  00:42 Найти цитируемый пост)
Я в хорошем толмуте по php известных авторов читал, что GET почти не используется в современных скриптах по причине безопасности и может ещё каким.


Либо авторы "талмуда" дураки, либо ты их не понял. GET и POST используются там, где каждый из методов нужен. Причем GET используется гораздо чаще, чем POST.

Добавлено через 13 минут
Anarki, ты поторопился с кодом.
Товарищ говорит загадками.
Ты его спрашиваешь - какую проблему, а он твой вопрос игнорирует. И правильно - зачем утруждаться, что-то объяснять .если гоовый код уже дали?
Дальше опять туманные намёки:  "скрипт не всё делает так как надо". что делает, как делает? Непонятно. 
Вместо того, чтобы вместе разобраться - делаем кривой скрипт, который пишет "Внимание: страница устарела".

Зачем идти на поводу у начинающего? Зачеп портить нормальные скрипты? Зачем плодить заплатки? 
Надо, чтобы человек разобрался в проблеме. А не утащил очередной готовый код без малейшего понимания, как он работает.
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.1276 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.