Эта тема на forum.dklab.ru


Markus: Организация не конфликтующих сессий. Есть проблема!
Привет всем!
Такая проблема у меня!
На сайте есть форум и он использует ссесию.
Я сделал что то типа управления содержанием сайта, то есть админская часть с авторизацией, тоже используя сессии.
Была проблема совместимости сессий, но прочитав этот топик, эта проблема исчезла но появилась новая.
Хотел было спросить там, чтобы не плодить темы, но та тема закрыта. Поэтому пишу здесь.
Вообщем вот код. Он конечно сильно утрирован, но основная часть которая касается авторизации и вызывает проблемы приведена полностью.
<?
session_start();

$admin = array();

$vars = array();

$vars = parsed_vars(); #Я не стал приводить здесь эту функцию
#дабы уменьшить показываемый код
$admin['name'] = '91183e1cb4e46961f86a2ef6287927ad';
$admin['pass'] = 'c4924c0dea0cfb6dea3068bd0dadb61d';
$admin['ip'] = 'XXX.XXX.XXX.*';
#Ниже данные переданные из формы авторизации
$pass = $vars['pass'];
$name = $vars['name'];

if(checklgn()){# Функция checklgn() проверяет в сессии
#правильность логина и пароля в случае
#если они верны возвращает true и false
#если хотя бы одно не верно.
#Эта функция тоже работает нормально
#поэтому не привожу здесь
if(Здесь некое условие){
Если условие верно выполняем это
}
elseif (isset($vars['exit'])) { //Если нажали ссылку "выход"
$_SESSION['admin'] = array();
session_destroy($_SESSION['admin']);
my_setcookie('n','',-1);
my_setcookie('p','',-1);
echo "Вы благополучно вышли из админской части";
}
}
else{ #Вот здесь и начинаются проблемы
if(isset($name) and isset($pass)){
if(md5($pass) == $admin['pass'] and md5($name) == $admin['name']){
$_SESSION['admin']['p'] = md5($pass);
$_SESSION['admin']['n'] = md5($name);
my_setcookie('n',md5($name));
my_setcookie('p',md5($pass));
echo "Успешный вход в систему";
}
else {
echo "Ошибка ввода пароля и логина!";
}
}
else{
if(ereg("^$admin[ip]$",$_SERVER['REMOTE_ADDR'])){
echo "Ваш IP верен, но Вам надо авторизоваться!";
}
else {
echo "Попытка несанкционированного доступа!";
}
}
}
?>

Проблемы начались когда я в сессии создал массив $_SESSION['admin'].
Как видно из кода, скрипт проверяет IP и если он верен показывает форму для ввода данных на авторизацию.
Но скрипт выдает "Попытка несанкционированного доступа!".
Я убрал из скрипта проверку IP. Форма показывается, но при вводе ВЕРНЫХ данных скрипт выдает "Ошибка ввода пароля и логина!".
Короче путем всевозможных проверок я пришел к выводу, что в в пределах кода который отвечает за авторизацию
не видны $admin['pass'], $admin['name'] и admin['ip'], хотя когда я не использовал массивы в сессии все было видно и все что связано с авторизацией
работало нормально.
Да и еще! Самое интересное что этот код на "Денвере" у меня на локалке работает ВАЩЕЕЕ без багов, а в нете на сервере появляются эти баки!
Что я сделал не так?
Подскажите!
Извините если я где то в тексте я называл вещи не своими именами. Не очень я силен в терминологии.
bæv:
$admin['ip'] = 'XXX.XXX.XXX.*'
-- "звёздочка" здесь явно лишняя. Как у Вас это могло в ereg'е работать -- не понимаю.

P.S. Не пробовали вместо "and" ставить "&&"?
Дмитрий Котеров:
Не пробовали вместо "and" ставить "&&"?
Да, кстати. Выражение:

md5($pass) == $admin['pass'] and md5($name) == $admin['name']

если не ошибаюсь, трактуется как:

md5($pass) == ($admin['pass'] and (md5($name) == $admin['name']))

Ну или что-то вроде этого.

я пришел к выводу, что в в пределах кода который отвечает за авторизацию
не видны $admin['pass'], $admin['name'] и admin['ip']
Ну тав Вы вставьте print_r($_SESSION) в то место, в котором сомневаетесь, и посмотрите, что хранится в $_SESSION.
Markus:
baev:
-- "звёздочка" здесь явно лишняя. Как у Вас это могло в ereg'е работать -- не понимаю.
У меня прекрассно работает! У меня на этом система бана по IP и даже по сетке IP работает!
И даже так работает $admin['ip'] = '.*'; тогда впускает всех!
Попробуйте сами.
Не пробовали вместо "and" ставить "&&"?
Пробовал толку нет!
Дмитрий Котеров:
Да, кстати. Выражение:

md5($pass) == $admin['pass'] and md5($name) == $admin['name']

если не ошибаюсь, трактуется как:

md5($pass) == ($admin['pass'] and (md5($name) == $admin['name']))

Ну или что-то вроде этого.
md5($pass) == $admin['pass'] and md5($name) == $admin['name']
В этой строке я сравниваю введеный логин и пароль. Так как заданные логин и пароль зашифрованы в md5
поэтому md5($pass) == $admin['pass'] и md5($name) == $admin['name'].
Исходя из сказанного я не понял эту строку
md5($pass) == ($admin['pass'] and (md5($name) == $admin['name']))
Ведь $pass это введеный пользователем пароль, а $name это введенный логин ?!
Или я что то не понимаю или это совсем неправильный код. Вы уж конечно извините мне такое высказывание!
Ну тав Вы вставьте print_r($_SESSION) в то место, в котором сомневаетесь, и посмотрите, что хранится в $_SESSION.
А причем здесь сессия? С сессиями как раз все нормально!
В этом месте не определяются, заданные зараннее в начале скрипта (помотрите выше код), $admin['pass'], $admin['name'] и $admin['ip'] !
Поэтому и выдает "Попытка несанкционированного доступа!", так как не с чем сравнить $_SERVER['REMOTE_ADDR'].
А раз не с чем, то и условие не выполняется. А не выполняется условие получите "Попытка несанкционированного доступа!".
я взял и внаглую вставил значение $admin['ip'] вот так

else{
$admin['ip'] = 'ХХХ.ХХХ.ХХХ.*';
if(ereg("^$admin[ip]$",$_SERVER['REMOTE_ADDR'])){
echo "Ваш IP верен, но Вам надо авторизоваться!";
}
else {
echo "Попытка несанкционированного доступа!";
}
}
И я увидел "Ваш IP верен, но Вам надо авторизоваться!". Вот я и говорю что скрипт почему то не видит в этом месте значения $admin['pass'], $admin['name'] и $admin['ip'] !
Самое интересное что, как я уже писал выше, на локалке на "Денвере" все работает изумительно?
А то же самое на сервере не хочет работать.
И потом все это работало без $_SESSION['admin'] на сервере тоже исключительно, то есть без массива в сессии. Как только в сессии создал массив началась такая бага!
Дмитрий Котеров:
В этой строке я сравниваю введеный логин и пароль.
Вы-то, может, и сравниваете, да вот PHP — это не Вы. Приоритет оператора and меньше, чем у ==, поэтому он выполняется раньше оператора сравнения. Порядок действий в школе проходили? Что * выполняется раньше, чем +. С == и and — точно такая же ситуация. Используйте вместо него &&, который имеет высший приоритет.

А причем здесь сессия? С сессиями как раз все нормально!
Ну, тогда поставьте print_r($admin), какая разница-то... Выведите вообще на экран все, с чем работает. А теоритезировать тут долго можно.
Markus:
Дмитрий Котеров:
Спасибо!
print_r($admin) очень помог!
Дело в том что массив с заданными паролем, логином и IP называется $admin, в то же время массив в сессии тоже называется $admin.
Вот скрипт и брал данные из массива сессии, а не из массива заданных для авторизации значений.
Я просто не думал что это может повлиять! Теперь знаю. Переименовав массив с заданными для авторизации значениями, все стало работать как надо!
Вот только почему же на Денвере это не отразилось?
Не подскажете?
Если скажете что по Денверу надо спрашивать в другом разделе, то ок так и сделаю.
Еще раз большое спасибо!
Дмитрий Котеров:
В режиме register_globals все ключи из $_REQUEST (т.е. из $_GET, $_POST и $_SESSION), а также из $_SERVER, становятся обычными переменными. Может быть, это Вам как-то поможет.

Да вот только в Денвере register_globals по умолчанию включен.
Markus:
Дмитрий Котеров:
Да вот только в Денвере register_globals по умолчанию включен
Я его выключил, чтобы уже наверняка скрипты работали везде.
Вообщем еще раз спасибо! В принципе думаю можно закрывать тему.
Дмитрий Котеров:
Тема закрыта.

Эта тема на forum.dklab.ru