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

Форум PHP

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

 

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

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

тема: Неубиваемая кука
 
 автор: Flok   (05.10.2010 в 20:59)   письмо автору
 
 

на своём сайте писал авторизацию. залогинился на одной странице, в браузер была отослана кука.


теперь происходит странная магия. Объясняю всё на http-заголовках

Запрос:

GET /articles/jquery/1/ HTTP/1.1
Cookie: aut_login=Flok; aut_password=хеш пароля;PHPSESSID=f72b9a6b88dbbf8a7adb44d36c8a1082


ответ:

HTTP/1.1 200 OK

.... ещё куча неважных строк.

Теперь иду на страницу 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_logintime()+15*24*60*60);
        
setcookie("aut_password"$aut_passwordtime()+15*24*60*60);
        }

?>


Очень надеюсь на вашу помощь, так как я уже с кукой стал сходить с ума.

  Ответить  
 
 автор: heed   (06.10.2010 в 00:54)   письмо автору
 
   для: 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()

  Ответить  
 
 автор: Flok   (06.10.2010 в 08:55)   письмо автору
 
   для: 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 ?

  Ответить  
 
 автор: Flok   (06.10.2010 в 16:28)   письмо автору
 
   для: .heed   (06.10.2010 в 12:00)
 

пардон. при редактировании темы увлёкся, стёр лишнее. там опечатка. естественно там должно быть aut_login

  Ответить  
 
 автор: heed   (07.10.2010 в 00:56)   письмо автору
 
   для: 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 любой страницы ставятся такие куки

  Ответить  
 
 автор: Flok   (07.10.2010 в 09:05)   письмо автору
 
   для: heed   (07.10.2010 в 00:56)
 

>что-то напоминает показ браузером кэшированой страницы, если нажатие F5 не помогает, значит всётаки ещё чего-то затёрли, и хост в одном случае www.localhost , а в другом просто localhost
или кривой браузер.

принудительно обновлял страницу (ctrl + f5), вычищал всё руками. один и тот же результат. в 4 браузерах. и хост www.localhost у меня в принципе не мог получиться )

>> header('location: '.$_SERVER['HTTP_REFERER']);
>$_SERVER['HTTP_REFERER'] может быть неопределена, если отключено в браузере.

забыл это. доработаю.

>данные совсем не фильтруются
у хостера какая-то защита своя стоит, при попытке сделать инъекцию мускулу появляется страница с ругательствами от самого хостера.
Но фильтровать буду, конечно же )

>здесь точно нужен четвёртый параметр
да, в этом , как оказалось, и было дело.

спасибо!

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

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