Ключевые слова:php, session, sql, web, (найти похожие документы)
Date: Sat, 29 Mar 2003 04:01:53 +0500
From: Paul Yanchenko <[email protected]>
Newsgroups: ftn.ru.php
Subject: Пример реализации поддержки web-сессий
PY>> Пpи логине пользователя на опpеделенной стpанице ему пpисваивается некий
PY>> уникальный session_id, котоpый генеpиpуется случайным обpазом и
PY>> сохpаняется в таблицу, в котоpой также записывается имя (или id)
PY>> пользователя,
DR> Кстати, хоpошо это или плохо по сpавнению с asp ? Где всегда пpи pаботе с
DR> объектом Session подpазумевается именно этот юзеp именно с этого
DR> компьютеpа, не надо пеpедавать никакие паpаметpы, и всю инфу хpанить пpям
DR> в нём (текущий id, имя, да и вообще что угодно).
Я не вполне понял тебя. Я не знаком с ASP. Ты имеешь в виду, что в ASP за каждым
пользователем закреплен всегда один и тот же идентификатор сессии? Если это так, то
это довольно глупо. Поэтому скорее всего я тебя просто неправильно понял. В PHP
вроде бы есть какая-то поддержка сессий, но мне было влом с ней разбираться, я
реализовал свой вариант, который описал выше. То есть все что тебе надо для этого
это таблицу sessions, например, такого вида:
CREATE TABLE sessions (
session_id varchar(16) NOT NULL default '',
user_id int(11) NOT NULL default '0',
expire datetime NOT NULL default '0000-00-00 00:00:00',
ip varchar(15) NOT NULL default '',
x_forward varchar(100) NOT NULL default '',
PRIMARY KEY (session_id,session_id)
) TYPE=MyISAM COMMENT='Sessions';
И связанную с ней таблицу users, например, такого вида:
CREATE TABLE users (
user_id int(11) NOT NULL auto_increment,
username varchar(16) NOT NULL default '',
password varchar(32) NOT NULL default '',
nick varchar(32) NOT NULL default '',
firstname varchar(32) NOT NULL default '',
middlename varchar(32) NOT NULL default '',
lastname varchar(32) NOT NULL default '',
last_login datetime NOT NULL default '0000-00-00 00:00:00',
cur_login datetime NOT NULL default '0000-00-00 00:00:00',
visits int(11) NOT NULL default '0',
PRIMARY KEY (user_id),
UNIQUE KEY username (username)
) TYPE=MyISAM COMMENT='Users of my site';
В таблице users хранятся записи пользователей, я ее немного урезал, там еще могут
храниться access list. Таблица sessions в общем случае пустая. Логинится
пользователь, мы делаем запрос в таблицу users:
SELECT `user_id` FROM `users` WHERE (username='username') &&
(password=PASSWORD('$password')) LIMIT 1
(Пароли у пользователей лучше хранить в виде хэша и сравнивать уже хэши от паролей,
получаемые функцией PASSWORD или MD5).
Если по этому запросу что-нибудь нашлось - значит имя пользователя и пароль
правильные, иначе "Go fuck!".
Если правильные - генерируем случайный session_id. Лочим таблицу sessions на предмет
записи в нее. Проверяем есть ли в ней уже такой идентификатор сессии. Если есть -
генерируем другой и снова проверяем, если нет - добавляем, присваиваем этой сессии
user_id от введенного имени, записываем ip-адрес пользователя, устаналиваем срок
жизни на какое-то время вперед.
Производим переход посредством header("Location:...."); на страницу с ограниченным
доступом и передаем в параметрах этот session_id.
Hа этой странице проверяем: есть ли такой идентификатор сессии в таблице sessions,
если нет - "Go fuck!", если есть, совпадают ли ip и http_x_forwarded_for с теми, что
были получены при логине пользователя, если нет - "go fuck". Hаконец, проверяем по
access list'у есть ли у пользователя с идентификатором user_id права доступа к
данной странице или нет. И если все OK, то обновляем запись в таблице sessions
изменяя expire:
UPDATE `sessions` SET `expire`=(NOW() + INTERVAL 1 HOUR) WHERE
session_id='$session_id'