boltikov
Новичок
Огромная проблема с авторизацией.
Есть большой проект знакомств, до 250000 хитов, до 280 пользователей онлайн одновременно. Проект состоит из общей части и закрытой (только для авторизированных пользователей: редактирование анкеты, пользовательская стастистика, адресная книга, переписка). Пользовательские данные храняться в стандартном файле сессии, все в одной переменной $sessvar.
Для проверки авторизован пользователь или нет проверяется $sessvar['user']['auth'] - если она true, то пользователь авторизован. В дальнейшем для авторизованных пользователей все индивидуальные страницы выводятся на основе $sessvar['user']['id'] (уникальный), который представляет себе PRIMARY KEY (auto_incriment) таблицы пользователей.
Примерно три недели назад начались проблемы. Пользователи открыв сайт, то есть набрав в адресной строке браузера адрес сайта или перейдя по ссылке из письма в свой почтовый ящик (ссылка типа http://site/in/inbox/ ) оказываются авторизованы под чужим логином. Соответсвенно они могут менять чужую анкету, вести переписку от имени другого пользователя.
Работа с той частью проекта, которая требует авторизации, без поддержки кукиз невозможна.
Для решения проблемы был пересмотен весь код на предмет не задается ли где-нибудь $sessvar['user']]['id'] случайным образом, а не из сессии или ищ данных пришедших в результате sql-запроса при авторизации. Нет, не задается.
Потом был в ручную задан механизм определения id сессии с проверкой существуют ли такой файл или нет.
Не то ни другое не помогло. Также как и запрет кэширования.
Также был просомтрен баг лист PHP на предмет работы сессиями но ничего аналогичного замечано не было.
В настоящее время проект работает на
FreeBSD ******.ru 4.11-RELEASE FreeBSD 4.11-RELEASE #2: Thu Ja i386
Apache/1.3.33 (Unix)rus/PL30.20 PHP/4.3.10 mod_accel/1.0.31
Месяц назад был совершен перенос проект на данный сервер, до этого он работал на FreeBSD 4.9-p2 Apache/1.3.31 (Unix) mod_accel/1.0.31 php 4.3.9 и вышеописанной проблемы не было.
В чем может быть проблема? Кривость рук и соответсвенно кода? Какой-то баг PHP или PHP и чего-то еще?
Есть большой проект знакомств, до 250000 хитов, до 280 пользователей онлайн одновременно. Проект состоит из общей части и закрытой (только для авторизированных пользователей: редактирование анкеты, пользовательская стастистика, адресная книга, переписка). Пользовательские данные храняться в стандартном файле сессии, все в одной переменной $sessvar.
Для проверки авторизован пользователь или нет проверяется $sessvar['user']['auth'] - если она true, то пользователь авторизован. В дальнейшем для авторизованных пользователей все индивидуальные страницы выводятся на основе $sessvar['user']['id'] (уникальный), который представляет себе PRIMARY KEY (auto_incriment) таблицы пользователей.
Примерно три недели назад начались проблемы. Пользователи открыв сайт, то есть набрав в адресной строке браузера адрес сайта или перейдя по ссылке из письма в свой почтовый ящик (ссылка типа http://site/in/inbox/ ) оказываются авторизованы под чужим логином. Соответсвенно они могут менять чужую анкету, вести переписку от имени другого пользователя.
Работа с той частью проекта, которая требует авторизации, без поддержки кукиз невозможна.
Для решения проблемы был пересмотен весь код на предмет не задается ли где-нибудь $sessvar['user']]['id'] случайным образом, а не из сессии или ищ данных пришедших в результате sql-запроса при авторизации. Нет, не задается.
Потом был в ручную задан механизм определения id сессии с проверкой существуют ли такой файл или нет.
PHP:
if (!$_COOKIE["LOVESESS2"]) {
$sess_id = "";
do {
$sess_id = sha1($_SERVER['HTTP_X_FORWARDED_FOR']."#".$_SERVER['REMOTE_ADDR'].microtime().$_SERVER["HTTP_USER_AGENT"]);
$sess_file = "/tmp/sess_".$sess_id;
} while (is_file ($sess_file));
session_id ($sess_id);
}
PHP:
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // always modified
header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache"); // HTTP/1.0
В настоящее время проект работает на
FreeBSD ******.ru 4.11-RELEASE FreeBSD 4.11-RELEASE #2: Thu Ja i386
Apache/1.3.33 (Unix)rus/PL30.20 PHP/4.3.10 mod_accel/1.0.31
Месяц назад был совершен перенос проект на данный сервер, до этого он работал на FreeBSD 4.9-p2 Apache/1.3.31 (Unix) mod_accel/1.0.31 php 4.3.9 и вышеописанной проблемы не было.
В чем может быть проблема? Кривость рук и соответсвенно кода? Какой-то баг PHP или PHP и чего-то еще?