![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
tikitiki |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 10.5.2005 Репутация: нет Всего: нет |
Видимо данный вопрос вполне уместно задать в данном топике профессионалам. Т.к. бьюсь с этим вопросом очень давно (месяцы). Подобную тему я поднимал, то что ответили -понравилось и применял, но всё равно меня не устроило полностью решение вопроса, т.к. он и не решился вообще-то.
Дело в том, что при создании сайтов я использую вход-выход на сайт пользователей по логину и паролю как обычно. Но после выхода пользователя при переходе на предыдущие страницы -они опять начинают выполнять например добавление товара в корзину. Видел сайты, которые этим не страдают. Вопрос-как же правильно сделать? Делаю так-страницы связаны методом post через данные форм. Кнопка выхода ведёт на страницу, где стандартно разрушаю сессию и ещё и куки удаляю. И что только не делал. Придумал один способ нестандартный-изменил текст программы-получилось,но зачем он нестандартный нужен!!! Мне советовали редирект применять на старницу какую-нибудь. Пробовал тоже. Но это же не избавляет от того, что пользователь нажмёт кнопку назад и опять получится тот же результат. Как редирект использовать для правильного обновления страниц-разобрался, хотя к вопросу видимо это не имеет отношения. Я имею ввиду-чтоб данные повторно не отправлялись при отправке формы, например. Последняя идея мне пришла в голову-хранить информацию о пользователях(логины-они же уникальные) в бд(использую mysql), а также вход и выход в полях бд для данного логина. Тогда при переходе на предыдущую страницу проверяем из бд делал ли выход пользователь с таким логином и если да, то показываем пустую страницу, например. Или лучше на главную страницу переправить. Данный метод видимо сработает, но я его полностью не протестировал пока. Применяют ли данный метод на самом деле и нужно ли его применять, если хочешь получить профессиональный сайт? И как же всё-таки на самом деле поступают в данном случае пофессионалы? Модераторам: это один вопрос, состоящий из небольших подвопросов. |
|||
|
||||
Anarki |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 14.3.2005 Репутация: 1 Всего: 11 |
А при выходе сессия правильно уничтожается (сессия хранится на стороне сервера, а не у клиента) ? Куки бы тоже пользователям удалить не мешало бы. И там, где товар добавляется, да и вообще на всех страницах должна стоять проверка на какие-то данные сессии, что пользователь авторизирован. Если он назад нажмет то может форма у него и появится(из кеша браузера), но добавить он ничего не сможет или в этом и есть вопрос, чтобы вообще не показывать предыдущую страницу человеку, если он уже сделал выход? Решение такого врядли есть общее, потому как страницы браузер в кеш сохраняет и пользователь работает с локальной страницей. Можно попробовать кеширование отключить
в начало скрипта
Можно вполне обойтись сессиями. В БД разве что хранят привилегии пользователей, пароли и какие-то ID, чтобы не было пароля в cookie, а только ID Это сообщение отредактировал(а) Anarki - 21.11.2007, 08:19 |
||||
|
|||||
tikitiki |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 10.5.2005 Репутация: нет Всего: нет |
Просто невероятно.
Вот проверку такую я как раз на всех страницах делаю и проверял и по идентификатору сессии, и по логину пользователя (в отдельности, а не вместе). И ещё может как. Но всё равно проблема существовала и существует. Приведу пример моих действий: 1) Ближе к началу программы (стараюсь вообще в начале)
далее может через несколько строк проверку делаю например так
А в скрипте для входа пользователя регистрирую переменную сессии и присваиваю ей логин пользователя из бд:
Правда два эти участка программы получились не связанные. На других страницах у меня смотрел ещё запутанней проверка авторизации. Хотел привести код, но наверное не стоит запутывать. Когда-то проверка была проще, но постепенно разрослась. Но я думаю, что проверка не должна быть причиной неправильной работы скрипта. Ведь смысл проверки авторизации я понимаю не плохо. Не могу же я на всех страницах одинаково ошибаться, тем более что тестов и редактирований много делал. Пустые страницы мне получать не обязательно. Мне бы добиться, чтоб формы после выхода пользователя не отправляли данные снова. Спасибо большое за помощь. |
||||||||
|
|||||||||
tikitiki |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 10.5.2005 Репутация: нет Всего: нет |
Извиняюсь. Там выше участки программы получились не связанные, но на самом
деле были связаны. Переменная session_login у меня в другом скрипте приняла название login_session. Но это можно не считать за ошибку, т.к. я её видел и исправлял. Видимо всё-таки дело не совсем в этих ошибках, а в чём-то другом-для меня пока не постижимом.
Понятно. Но логины видимо можно хранить тоже. Читал вроде, что логины зашифрованные по крайней мере md5, вполне можно хранить в бд. А вход и выход-я так понял-не надо хранить. Так в чём же может быть проблема всё-таки? Добавлено через 11 минут и 6 секунд По-моему правильно. Делаю так:
Можно попробовать. Но это, если хочешь пустую страницу получить, когда пользователь вышел. А если всё-таки попробовать, то поможет ли это избавить от повторной отправки формы? |
||||
|
|||||
tikitiki |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 10.5.2005 Репутация: нет Всего: нет |
Более кратко выражу свою проблему. Может ли скрипт при локальном тестировании в win выдавать такую ошибку, а на сервере *nix исправно себя вести? И часто ли поведение скрипта на локальном пк отличается от поведения на хорошем платном хостинге?
И хотелось бы очень увидеть маленький, но правильный пример проверки авторизации пользователя при входе на страницу. Может мои проблемы будут решены. |
|||
|
||||
Anarki |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 14.3.2005 Репутация: 1 Всего: 11 |
Какую? Показ всех ошибок включен? Выставить display_errors = On error_reporting = E_ALL и смотреть, может он что-то не может сделать с сессией
Да, от разницы в версиях php,от его настроек, от включенного сейфмода, от того, привязан ли локальный скрипт к особенностям ОС и т.д. Это сообщение отредактировал(а) Anarki - 25.11.2007, 11:33 |
||||
|
|||||
Anarki |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 14.3.2005 Репутация: 1 Всего: 11 |
Пример.
При добавлении товара, а затем нажатии на выход, сессия уничтожается и если перейти назад с помощью кнопки браузера "назад", дойти до формы и вбить другой товар, то после нажатия на самбит, он перекинет на форму аутентификации, а товар не добавится.
Это сообщение отредактировал(а) Anarki - 16.12.2007, 17:30 |
|||
|
||||
tikitiki |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 10.5.2005 Репутация: нет Всего: нет |
Anarki, спасибо огромнейшее за пример!!
![]() Отвечаю повышением твоей репутации конечно. В примере всё понятно. Но на всякий случай уточнить бы надо. Пример я так понял можно считать за полноценный скрипт, который можно использовать как есть. Но вопрос один конкретный у меня остался: $_SESSION['id'] - везде в скрипте подразумеваем - используется для хранения логина, введённого через форму методом POST($_POST['login'])? И менее важный вопросик: методы GET и POST так и используем наравне в данном скрипте? Я в хорошем толмуте по php известных авторов читал, что GET почти не используется в современных скриптах по причине безопасности и может ещё каким. Ещё раз спасибо. ![]() |
|||
|
||||
Anarki |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 14.3.2005 Репутация: 1 Всего: 11 |
Да. Для передачи форм? На самом деле совсем чуть усложняет жизнь злоумышленникам, если они захотят поискать дыры в скрипте. Т.к. тут нужно еще HTML код формы смотреть, но не более. Метод GET для форм может применятся чтобы передавать 1-2 параметра скрипту, например поисковая форма, там очень часто используется метод GET. Наверное правильней мне было бы сделать так: сделать новое поле
и убрать из action формы строку запроса. А в скрипте получать action из $_GET, либо пытаться получить его из $_POST, если в $_GET нет action. |
||||
|
|||||
tikitiki |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 10.5.2005 Репутация: нет Всего: нет |
Anarki, спасибо.
Попробую применить. |
|||
|
||||
tikitiki |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 10.5.2005 Репутация: нет Всего: нет |
Anarki, если прочитаешь, то ответь. Я скрипт твой отдельно в файле тестировал. Но первый редирект от начала скрипта по-моему не совсем на своём месте стоит. Или не знаю в чём дело. Но скрипт не всё делает так как надо. Для того, чтоб увидеть ссылки на форму и на выход-надо обновлять страницу(если убрать первый редирект) и т.д.
|
|||
|
||||
Anarki |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 326 Регистрация: 14.3.2005 Репутация: 1 Всего: 11 |
Первый редирект стоит верно. Т.к. отправили форму - выполнили перенаправление: Установилась переменная сессии id, перенаправление, проверка существует ли id в $_SESSION, если да,то начал работать блок приложения с выводом формы.
Вообщем я переписал кое - что, без редиректа теперь работает.
Всё ли понятно? |
|||
|
||||
Feldmarschall |
|
|||
Новичок ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2641 Регистрация: 11.12.2007 Репутация: -2 Всего: 32 |
Забавный топик
|
|||
|
||||
tikitiki |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 10.5.2005 Репутация: нет Всего: нет |
Anarki, протестирую-скажу.
Feldmarschall, для меня не очень забавный.)))) Добавлено через 11 минут и 19 секунд Anarki, код понятен. Надо протестировать. Да и первый код был понятен. Почему-то не протестировался нормально. |
|||
|
||||
Feldmarschall |
|
||||||
Новичок ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 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.
Этого добиться невозможно. Твой скрипт должен не обрабатывать такую форму. а запретить посылать форму нельзя.
Логин, разумеется, хранят в базе. Anarki просто забыл его написать. MD5 - это не шифр, и логин этой функцией не обрабатывают. обрабатывают, иногда - пароль.
Либо авторы "талмуда" дураки, либо ты их не понял. GET и POST используются там, где каждый из методов нужен. Причем GET используется гораздо чаще, чем POST. Добавлено через 13 минут Anarki, ты поторопился с кодом. Товарищ говорит загадками. Ты его спрашиваешь - какую проблему, а он твой вопрос игнорирует. И правильно - зачем утруждаться, что-то объяснять .если гоовый код уже дали? Дальше опять туманные намёки: "скрипт не всё делает так как надо". что делает, как делает? Непонятно. Вместо того, чтобы вместе разобраться - делаем кривой скрипт, который пишет "Внимание: страница устарела". Зачем идти на поводу у начинающего? Зачеп портить нормальные скрипты? Зачем плодить заплатки? Надо, чтобы человек разобрался в проблеме. А не утащил очередной готовый код без малейшего понимания, как он работает. |
||||||
|
|||||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Для профи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |