Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Не могу пройти авторизацию на собственном сайте
 
 автор: Keks   (14.09.2008 в 14:31)   письмо автору
 
 

Всем привет! Конечно, название темы выглядит, наверное, смешно, но это действительно так. Сделал сайт, проверил на локалхосте несколько раз, все работает отлично. загрузил сайт на хостинг (www.3eu.ru), так вот когда я пытаюсь пройти авторизацию (форма авторизации ведет на файл authorization.php, в котором выполняется проверка правильности введенных данных), и что бы я не вводил в поля логин и пароль, независимо от правильности введенных данных, выдается пустая страница (будто в файле проверки вообще никакого кода нету, а он там есть)!
Подскажите, пожалуйста, чем это вызвано и как с этим бороться?

  Ответить  
 
 автор: Trianon   (14.09.2008 в 15:20)   письмо автору
 
   для: Keks   (14.09.2008 в 14:31)
 

не видя кода, бороться сложно.

  Ответить  
 
 автор: Keks   (14.09.2008 в 15:42)   письмо автору
1.4 Кб
 
   для: Trianon   (14.09.2008 в 15:20)
 

файл authorization.php в архиве

  Ответить  
 
 автор: Trianon   (14.09.2008 в 16:17)   письмо автору
 
   для: Keks   (14.09.2008 в 15:42)
 

<?php
// стартуем ессию
session_start();

// если требуется установить куки, то устанавливаем их
if (isset($_GET['action']) && $_GET['action'] == "setcookie")
{
    
setcookie("login"$_SESSION['login'], time() + 5184000);
    
setcookie("password"$_SESSION['password'], time() + 5184000);
    require(
"./global.php");
    echo 
"<meta http-equiv='refresh' content='3; url=./index.php'>";
    
page("<div align='center' style='color:red;'>Авторизация успешно пройдена! 
Сейчас Вы будете перемещены на главную страницу...\n<br><a href='./index.php'>Перейти</a></div>"
);
}

// подключаем главный файл
require_once("./global.php");

// если действие не указано,
// значит, из формы были переданы данные
if (!isset($_GET['action']))
{
    
// проверяем сессию
    
if ($_POST['sid'] != session_id())
    {
        exit(
"<b>Попытка взлома, скрипт остановлен!</b>\n
<meta http-equiv='refresh' content='3; url=./index.php'>"
);
    }
    else
    {
        
// логин и пароль, которые были введены в форму
        
$user_login trim(htmlspecialchars(addslashes($_POST['login'])));
        
$user_pass md5(trim(htmlspecialchars($_POST['passw']))); 
        
// пароль в БД хранится в зашифрованном виде (MD5())
        // запрос в БД на получение данных пользователя с указанным логином
        
$query mysql_query("SELECT login, passw FROM settings WHERE login='$user_login'");
        if (!
$query)
        {
            
db_error(mysql_error());
        }
        else
        {
            
// если пользователь с таким логином существует
            
if (mysql_num_rows($query) > 0)
            {
                
$result mysql_fetch_array($query);
                
// то сравниваем введенные в форму логин и пароль с теми,
                // которые мы только что получили из БД
                
if ($user_login == $result['login'] && $user_pass == $result['passw'])
                {
                    
// добавляем данные в сессию
                    
$_SESSION['login'] = $user_login;
                    
$_SESSION['password'] = $user_pass;
                }
                else
                {
                    exit(
"<b>Неверное сочетание логина и пароля</b>\n
<meta http-equiv='refresh' content='3; url=./index.php'>"
); // если пароль неверен
                
}
            }
            else
            {
                exit(
"<b>Неверно указан логин</b>\n
<meta http-equiv='refresh' content='3; url=./index.php'>"
); // пользователя с таким логином нет
            
}
        }
        
// если была поставлена галочка "Запомнить меня",
        // то перенаправляем пользовтеля на установку куков
        
if ($_POST['setcookie'] == "on")
        {
            echo 
"<meta http-equiv='refresh' content='0; url=./authorization.php?action=setcookie'>";
        }
        else 
// иначе просто пишем, что авторизация пройдена
        
{
            echo 
"<meta http-equiv='refresh' content='3; url=./index.php'>";
            
page("<div align='center' style='color:red;'>Авторизация успешно пройдена! 
Сейчас Вы будете перемещены на главную страницу...\n<br><a href='./index.php'>Перейти</a></div>"
);
        }
    }

}
else
{
    
// если требуется выйти
    
if (isset($_GET['action']) && $_GET['action'] == "exit")
    {
        
// то очищаем сессию и куки
        
unset($_SESSION['login'], $_SESSION['password']);
        
$_COOKIE['login'] = "";
        
$_COOKIE['password'] = "";
        
setcookie("login""");
        
setcookie("password""");
        echo 
"<meta http-equiv='refresh' content='0; url=./index.php'>";
        
session_destroy();
    }
}

?>

формы как-то не видать.

Откровенно говоря, из-за дряни вроде htmlspecialchars не по делу и попыток запхать пароль в сессию - пытаться вникать в суть особо не тянет.

  Ответить  
 
 автор: Keks   (15.09.2008 в 00:26)   письмо автору
 
   для: Trianon   (14.09.2008 в 16:17)
 

суть проблемы может крыться в этих двух действиях? из за чего вообще могут быть такие различия в выполнении скрипта на локалхосте и на сервере?

  Ответить  
 
 автор: Trianon   (15.09.2008 в 00:45)   письмо автору
 
   для: Keks   (15.09.2008 в 00:26)
 

да полно может быть причин, по которым скрипт на одном сервере пойдет не так, как на другом.
К примеру, могут отличаться настройки поддержки сессий.

Вот этот оператор
if ($_POST['sid'] != session_id())
как работает и что делает?

  Ответить  
 
 автор: Keks   (15.09.2008 в 07:52)   письмо автору
 
   для: Trianon   (15.09.2008 в 00:45)
 

из скрытого поля формы передается идентификатор сессии и проверяется здесь. ну это, в общем-то, из Самоучителя PHP5 второе издание взято

  Ответить  
 
 автор: Trianon   (15.09.2008 в 09:45)   письмо автору
 
   для: Keks   (15.09.2008 в 07:52)
 

а.. если из самоучителя - тогда это к cheops'у

  Ответить  
 
 автор: Keks   (15.09.2008 в 11:32)   письмо автору
 
   для: Trianon   (15.09.2008 в 09:45)
 

нашел на этом сайте в статье "безопасное программирование на php" кусок кода авторизации с mysql, так вот у меня все почти так же как и там. а чем использование htmlspecialchars в данном случае плохо?

  Ответить  
 
 автор: Trianon   (15.09.2008 в 14:26)   письмо автору
 
   для: Keks   (15.09.2008 в 11:32)
 

тем, что его применили не там, где требуется.

Вы хотите знать, почему Ваш код не работает.
Я пытаюсь разобраться, как он работает.
И если вижу непонятные куски - спрашиваю у Вас: зачем здесь это?

Форму с этим самым скрытым полем Вы не показали.
Как мне определить, что у Вас там в поле осталось?

  Ответить  
 
 автор: mihdan   (15.09.2008 в 14:33)   письмо автору
 
   для: Trianon   (15.09.2008 в 14:26)
 

Давно уже пора вам маленькую статейки кидануть, а то что-то часто этот вопрос возникает "что как и где фильтровать и чем и зачем"

  Ответить  
 
 автор: Trianon   (15.09.2008 в 14:40)   письмо автору
 
   для: mihdan   (15.09.2008 в 14:33)
 

Жевано-пережевано двадцать раз.
Сам подход "фильтровать всё без разбора чем-то единым" - порочен.
Сухой остаток оформлен в 21-ю задачу. Примеры решения присутствуют.

А статьей бороться с книгой (и не одной) которую, не исправляя, повторно переиздают - бессмысленно.

  Ответить  
 
 автор: mihdan   (15.09.2008 в 14:42)   письмо автору
 
   для: Trianon   (15.09.2008 в 14:40)
 

Согласен с вами

>А статьей бороться с книгой (и не одной) которую, не исправляя, повторно переиздают - бессмысленно.
Это я понял камень в огород cheops'a

  Ответить  
 
 автор: Trianon   (15.09.2008 в 14:54)   письмо автору
 
   для: mihdan   (15.09.2008 в 14:42)
 

Это ответ на Ваше предложение.

  Ответить  
 
 автор: Keks   (15.09.2008 в 15:37)   письмо автору
 
   для: Trianon   (15.09.2008 в 14:26)
 

вот код формы:

<?php
// инициируем сессию
session_start();
// Функция, которая проверяет, авторизирован ли пользователь блога
function check_auth ($login$password)
{
    
// Проверяем, авторизирован ли пользователь в этой сессии
    
if (isset($_SESSION['auth']))
    {
        if (
$_SESSION['auth'] == "yes") return $check true;
        else return 
$check false;
    }
    
// если нет, то проверяем куки
    
elseif (isset($_COOKIE['login']) && isset($_COOKIE['password']))
    {
        if (
$_COOKIE['login'] == $login && $_COOKIE['password'] == $password) return $check true;
        else return 
$check false;
    }
    
// иначе возвращаем отрицательный результат проверки
    
else
    {
        return 
$check false;
    }
}
if (!
check_auth($login$password))
{
echo 
"<form action='./authorization.php' method='post'>
    <div>Логин:</div>
    <div><input type='text' maxlength='32' name='login'></div>
    <div>Пароль:</div>
    <div><input type='password' maxlength='32' name='passw'></div>
    <div><input type='checkbox' name='setcookie'>Запомнить меня</div>
    <input type='hidden' name='sid' value='"
.session_id()."'>
    <div><input type='submit' value='Войти'></div>
</form>"
;
}
?>

ну этот код находится в файле global.php, который во все остальные посредством require_once() вставляется.

  Ответить  
 
 автор: Trianon   (15.09.2008 в 15:43)   письмо автору
 
   для: Keks   (15.09.2008 в 15:37)
 

в строке if (!check_auth($login, $password))
обе переменные не определены.

И как результат,если в $_COOKIE['login'] и $_COOKIE['password'] окажутся сравнимые с нулем значения (false или нули, к примеру) - форма выведена не будет .
А если кроме формы не выводилось вообще ничего, то при заблокированных нотайсах мы увидим пустую страницу.

  Ответить  
 
 автор: Keks   (15.09.2008 в 15:52)   письмо автору
 
   для: Trianon   (15.09.2008 в 15:43)
 

ну они там не определены потому, что вытаскиваются из базы в самом начале файла global.php, вот код:

<?php
$get_settings 
= @mysql_query("SELECT * FROM settings WHERE id_user=1");
// Если при запросе произошла ошибка
if (!$get_settings)
{
    
// то выводим сообщение об ошибке пользователю
    
mysql_error();
    exit;
}
else
{
    
// если ошибки не произошло,
    // то преобразуем результат запроса в переменные
    
while ($settings mysql_fetch_array($get_settings))
    {
        
// Логин и пароль пользователя
        
$login $settings['login'];
        
$passw $settings['passw'];
    }
}
?>

не удивляйтесь, что логин и пароль запрашиваются из таблицы settings, просто сайт рассчитан только на одного зарегистрированного пользователя, и регистрация происходит сразу при установке скрипта на сервер.
P.S. в файле authorization.php форма и не должна выводиться, в этом файле только проверка осущесвляется

  Ответить  
 
 автор: Keks   (15.09.2008 в 16:41)   письмо автору
 
   для: Keks   (15.09.2008 в 15:52)
 

исправил код, перезалил на два сервера (3eu.ru и jino-net.ru), авторизация работает, спасибо за помощь! на 3eu.ru работает нормально, а вот на джино-нет.ру что-то не то! сначала выдает страницу, на которой написано, что авторизация пройдена и вы сейчас будете перемещены (даже меню авторизированного пользователя есть), а при переходе на другую страницу (т.е. при обновлении страницы) вся "авторизованность" как-будто теряется! словно я и не проходил авторизацию, снова форма вверху каждой страницы рисуется! не знаете, из за чего?
повторюсь, это только на джино-нет такая байда....

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования