|
|
|
| на своём сайте писал авторизацию. залогинился на одной странице, в браузер была отослана кука.
теперь происходит странная магия. Объясняю всё на http-заголовках
Запрос:
GET /articles/jquery/1/ HTTP/1.1
Cookie: aut_login=Flok; aut_password=хеш пароля;PHPSESSID=f72b9a6b88dbbf8a7adb44d36c8a1082
|
ответ:
.... ещё куча неважных строк.
Теперь иду на страницу exit.php
PHP код:
<?
session_start();
if (isset($_SESSION['id'])) unset($_SESSION['id']);
if (isset($_SESSION['login'])) unset($_SESSION['login']);
setcookie("aut_login", "", 0);
setcookie("aut_password", "", 0);
header('location: '.$_SERVER['HTTP_REFERER']);
?>
|
вот что делает она:
запрос:
GET /exit.php HTTP/1.1
Host: localhost
Referer: http://localhost/articles/jquery/1/
Cookie: login=Flok; password=хеш_пароля; PHPSESSID=f72b9a6b88dbbf8a7adb44d36c8a1082
|
Ответ:
HTTP/1.1 302 Found
Set-Cookie: aut_login=deleted; expires=Mon, 05-Oct-2009 12:58:13 GMT
Set-Cookie: aut_password=deleted; expires=Mon, 05-Oct-2009 12:58:13 GMT
Location: http://localhost/articles/jquery/1/
|
А теперь самая главная аномалия. Браузер перенаправляется на предыдущую страницу заголовком location, и вот что он при этом отсылает:
GET /articles/jquery/1/ HTTP/1.1
Cookie: aut_login=Flok; aut_password=хеш_пароля; PHPSESSID=f72b9a6b88dbbf8a7adb44d36c8a1082
|
(все лишние записи в заголовках удалил)
вопрос: WTF ? почему кука не убилась?
Самое прикольное то, что с этой страницы мне не разлогиниться. Перехожу на любую другую страницу, а с той страницы на exit.php - разлогинивание происходит нормально. но стоит мне уже разлогиненым перейти на ту страницу, так куки снова отсылаются.
Я мог списать это на глюк браузера, но эта ошибка возникает в огнелисе, опере, ие и хроме.
Может я чего-то не знаю о природе куков?
и на всякий случай, если понадобится. Все страницы выстроены таким образом: сначала инклудится хидер, в котором авторизация. дальше лишь запросы к бд и вывод статей. то есть с куками и сессиями пока работает только один участок кода. вот он:
<? if ((isset($_POST['aut_login']) or isset($_COOKIE['aut_login'])) AND !isset($_SESSION['id'])) {
if (isset($_COOKIE['aut_login'])) {$aut_login=$_COOKIE['aut_login'];}
if (isset($_COOKIE['aut_password'])) {$aut_password=$_COOKIE['aut_password'];}
if (isset($_POST['aut_login'])) {$aut_login=$_POST['aut_login'];}
if (isset($_POST['aut_password'])) {$aut_password=$_POST['aut_password'];}
mysql_connect('localhost', 'scriptsite', '111111');
mysql_select_db('scriptsite');
$query = mysql_query('SELECT `id`, `login` FROM users WHERE login=\''.$aut_login.'\' AND password = \''.md5(md5($aut_password)).'\'');
$b = mysql_fetch_array($query);
if (isset($b[1])) {
$_SESSION['id'] = $b['id'];
$_SESSION['login'] = $b['login'];
setcookie("aut_login", $aut_login, time()+15*24*60*60);
setcookie("aut_password", $aut_password, time()+15*24*60*60);
}
} ?>
|
Очень надеюсь на вашу помощь, так как я уже с кукой стал сходить с ума. | |
|
|
|
|
|
|
|
для: Flok
(05.10.2010 в 20:59)
| | setcookie("aut_login", "", 0);
If set to 0, or omitted, the cookie will expire at the end of the session (when the browser closes).
ставьте ненулевое значение меньше time()
// или равным time() | |
|
|
|
|
|
|
|
для: heed
(06.10.2010 в 00:54)
| | не помогло.
заменил на
setcookie("aut_login", "", time()-1);
setcookie("aut_password", "", time()-1);
без толку.
хотя даже так, как у меня было написано раньше, можно разлогиниться с любой страницы, кроме /articles/jquery/1/
убивая куки вручную и прощупывая сайт, заметил такую особенность:
логинюсь на главной странице - разлогиниваюсь на любой.
логинюь на странице N - разлогиниваюсь на любой другой, кроме N (ей неизвестно откуда отправляются cookie). Если я потом разлогиненый захожу на страницу N, то я снова логинюсь по кукам. | |
|
|
|
|
автор: .heed (06.10.2010 в 12:00) |
|
|
для: Flok
(06.10.2010 в 08:55)
| | Что.то я стормозил отвечая в тот раз :) должны.же были просто пересылаться пустые значения.
Почему в заголовках login= а в скрипте aut_login ? | |
|
|
|
|
|
|
|
для: .heed
(06.10.2010 в 12:00)
| | пардон. при редактировании темы увлёкся, стёр лишнее. там опечатка. естественно там должно быть aut_login | |
|
|
|
|
|
|
|
для: Flok
(06.10.2010 в 16:28)
| | > что с этой страницы мне не разлогиниться. Перехожу на любую другую страницу, а с той страницы на exit.php - разлогинивание происходит
что-то напоминает показ браузером кэшированой страницы, если нажатие F5 не помогает, значит всётаки ещё чего-то затёрли, и хост в одном случае www.localhost , а в другом просто localhost
или кривой браузер.
с выставлением cookies javascript'ом на странице маловероятно
и непохоже что из-за отсутствия четвёртого параметра
а так на первый взгляд код не очень.... и аутентификация больше на сессиях
> header('location: '.$_SERVER['HTTP_REFERER']);
$_SERVER['HTTP_REFERER'] может быть неопределена, если отключено в браузере.
> SELECT `id`, `login` FROM users WHERE login=\''.$aut_login.'\' AND password = \''.md5(md5($aut_password)).'\'');
$b = mysql_fetch_array($query);
данные совсем не фильтруются, наверное счпасают magic_quotes
> if (isset($b[1])) {
$_SESSION['id'] = $b['id'];
$_SESSION['login'] = $b['login'];
setcookie("aut_login", $aut_login, time()+15*24*60*60);
setcookie("aut_password", $aut_password, time()+15*24*60*60);
}
здесь точно нужен четвёртый параметр если c любой страницы ставятся такие куки | |
|
|
|
|
|
|
|
для: heed
(07.10.2010 в 00:56)
| | >что-то напоминает показ браузером кэшированой страницы, если нажатие F5 не помогает, значит всётаки ещё чего-то затёрли, и хост в одном случае www.localhost , а в другом просто localhost
или кривой браузер.
принудительно обновлял страницу (ctrl + f5), вычищал всё руками. один и тот же результат. в 4 браузерах. и хост www.localhost у меня в принципе не мог получиться )
>> header('location: '.$_SERVER['HTTP_REFERER']);
>$_SERVER['HTTP_REFERER'] может быть неопределена, если отключено в браузере.
забыл это. доработаю.
>данные совсем не фильтруются
у хостера какая-то защита своя стоит, при попытке сделать инъекцию мускулу появляется страница с ругательствами от самого хостера.
Но фильтровать буду, конечно же )
>здесь точно нужен четвёртый параметр
да, в этом , как оказалось, и было дело.
спасибо! | |
|
|
|