|
|
|
| Всем привет! Конечно, название темы выглядит, наверное, смешно, но это действительно так. Сделал сайт, проверил на локалхосте несколько раз, все работает отлично. загрузил сайт на хостинг (www.3eu.ru), так вот когда я пытаюсь пройти авторизацию (форма авторизации ведет на файл authorization.php, в котором выполняется проверка правильности введенных данных), и что бы я не вводил в поля логин и пароль, независимо от правильности введенных данных, выдается пустая страница (будто в файле проверки вообще никакого кода нету, а он там есть)!
Подскажите, пожалуйста, чем это вызвано и как с этим бороться? | |
|
|
|
|
|
|
|
для: Keks
(14.09.2008 в 14:31)
| | не видя кода, бороться сложно. | |
|
|
|
|
 1.4 Кб |
|
|
для: Trianon
(14.09.2008 в 15:20)
| | файл authorization.php в архиве | |
|
|
|
|
|
|
|
для: 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 не по делу и попыток запхать пароль в сессию - пытаться вникать в суть особо не тянет. | |
|
|
|
|
|
|
|
для: Trianon
(14.09.2008 в 16:17)
| | суть проблемы может крыться в этих двух действиях? из за чего вообще могут быть такие различия в выполнении скрипта на локалхосте и на сервере? | |
|
|
|
|
|
|
|
для: Keks
(15.09.2008 в 00:26)
| | да полно может быть причин, по которым скрипт на одном сервере пойдет не так, как на другом.
К примеру, могут отличаться настройки поддержки сессий.
Вот этот оператор
if ($_POST['sid'] != session_id())
как работает и что делает? | |
|
|
|
|
|
|
|
для: Trianon
(15.09.2008 в 00:45)
| | из скрытого поля формы передается идентификатор сессии и проверяется здесь. ну это, в общем-то, из Самоучителя PHP5 второе издание взято | |
|
|
|
|
|
|
|
для: Keks
(15.09.2008 в 07:52)
| | а.. если из самоучителя - тогда это к cheops'у | |
|
|
|
|
|
|
|
для: Trianon
(15.09.2008 в 09:45)
| | нашел на этом сайте в статье "безопасное программирование на php" кусок кода авторизации с mysql, так вот у меня все почти так же как и там. а чем использование htmlspecialchars в данном случае плохо? | |
|
|
|
|
|
|
|
для: Keks
(15.09.2008 в 11:32)
| | тем, что его применили не там, где требуется.
Вы хотите знать, почему Ваш код не работает.
Я пытаюсь разобраться, как он работает.
И если вижу непонятные куски - спрашиваю у Вас: зачем здесь это?
Форму с этим самым скрытым полем Вы не показали.
Как мне определить, что у Вас там в поле осталось? | |
|
|
|
|
|
|
|
для: Trianon
(15.09.2008 в 14:26)
| | Давно уже пора вам маленькую статейки кидануть, а то что-то часто этот вопрос возникает "что как и где фильтровать и чем и зачем" | |
|
|
|
|
|
|
|
для: mihdan
(15.09.2008 в 14:33)
| | Жевано-пережевано двадцать раз.
Сам подход "фильтровать всё без разбора чем-то единым" - порочен.
Сухой остаток оформлен в 21-ю задачу. Примеры решения присутствуют.
А статьей бороться с книгой (и не одной) которую, не исправляя, повторно переиздают - бессмысленно. | |
|
|
|
|
|
|
|
для: Trianon
(15.09.2008 в 14:40)
| | Согласен с вами
>А статьей бороться с книгой (и не одной) которую, не исправляя, повторно переиздают - бессмысленно.
Это я понял камень в огород cheops'a | |
|
|
|
|
|
|
|
для: mihdan
(15.09.2008 в 14:42)
| | Это ответ на Ваше предложение. | |
|
|
|
|
|
|
|
для: 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() вставляется. | |
|
|
|
|
|
|
|
для: Keks
(15.09.2008 в 15:37)
| | в строке if (!check_auth($login, $password))
обе переменные не определены.
И как результат,если в $_COOKIE['login'] и $_COOKIE['password'] окажутся сравнимые с нулем значения (false или нули, к примеру) - форма выведена не будет .
А если кроме формы не выводилось вообще ничего, то при заблокированных нотайсах мы увидим пустую страницу. | |
|
|
|
|
|
|
|
для: 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 в 15:52)
| | исправил код, перезалил на два сервера (3eu.ru и jino-net.ru), авторизация работает, спасибо за помощь! на 3eu.ru работает нормально, а вот на джино-нет.ру что-то не то! сначала выдает страницу, на которой написано, что авторизация пройдена и вы сейчас будете перемещены (даже меню авторизированного пользователя есть), а при переходе на другую страницу (т.е. при обновлении страницы) вся "авторизованность" как-будто теряется! словно я и не проходил авторизацию, снова форма вверху каждой страницы рисуется! не знаете, из за чего?
повторюсь, это только на джино-нет такая байда.... | |
|
|
|