За последние 24 часа нас посетили 45314 программистов и 1813 роботов. Сейчас ищут 952 программиста ...

Программирование сессий

Тема в разделе "Прочие вопросы по PHP", создана пользователем FiMka, 30 май 2009.

  1. FiMka

    FiMka Активный пользователь

    С нами с:
    12 май 2009
    Сообщения:
    66
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Ребята, привет всем!

    Сегодня начал разбираться с сессиями, возник вопрос: есть два файла (приведены ниже), всегда при перенаправлении на index.php срабатывает условие if ( ! isset($user)). Как результат, соответственно, "You are not registered!" Отлаживаю на localhost (Denwer), может какие-то переменные сервера не включены или что-то еще? Подскажите, пожалуйста.

    Файл "authorization.php":
    PHP:
    1. <?php
    2.     $user = "guest";
    3.     session_start();
    4.     session_register("user");
    5.     header("Location: index.php");
    6. ?>
    Файл "index.php":
    PHP:
    1. <?php
    2.     session_start();
    3.     if ( ! isset($user)) {
    4.         echo "You are not registered!";
    5.         exit;
    6.     }
    7. ?>
    8. <html>
    9.     <body>
    10.       Привет, <?php echo $user; ?>!
    11.     </body>
    12. </html>
     
  2. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Файл "authorization.php":
    PHP:
    1. <?php
    2.     session_start();
    3.     $_SESSION["user"] = "guest";
    4.     header("Location: index.php");
    5. ?>
    Файл "index.php":
    PHP:
    1. <?php
    2.     session_start();
    3.     if (empty($_SESSION["user"])) {
    4.         echo "You are not registered!";
    5.         exit;
    6.     }
    7. ?>
    8. <html>
    9.     <body>
    10.       Привет, <?php echo $_SESSION["user"]; ?>!
    11.     </body>
    12. </html>
    А настроено все правильно. Подробнее читай в официальном мане
     
  3. FiMka

    FiMka Активный пользователь

    С нами с:
    12 май 2009
    Сообщения:
    66
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Я так понял, я использовал deprecated вариант (для PHP < 4.2.0) при PHP/5.2.4.
    TheShock, Ваш вариант помог, спасибо большое, буду разбираться дальше.
     
  4. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    FiMka, правильно понял. Приятных разбирательств :)
     
  5. FiMka

    FiMka Активный пользователь

    С нами с:
    12 май 2009
    Сообщения:
    66
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    В процессе разбора появился еще вопросик:
    Зашли на "authorization.php", перекинулись на "index.php", вывели "Привет, guest!", РНР, автоматически послал заголовки, как только скрипт выдал браузеру информацию, после этого, если вернуться на "authorization.php", вместо переброски на "index.php", имеем пресловутую:
    Вопрос: как граммотные люди поступают в таких случаях?
     
  6. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    На какой линии ошибка произошла? Что в этой линии? На какой линии начался вывод?
     
  7. FiMka

    FiMka Активный пользователь

    С нами с:
    12 май 2009
    Сообщения:
    66
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    TheShock, это на другом коде, с вашим вариантом все ок, как оказалось. Просто запутываться начинаю, из-за того, что понимания сильного нет, пожалуй пока все же сам поковыряюсь, пока вопросы более конкретные не появятся. :D Спасибо!
     
  8. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Посмотри, в конца файла какого-то после ?> пробел лишний закрасться мог. Ну или посмотри, в каком файле и на какой строке начался вывод - поймёшь, в чём проблема.
     
  9. FiMka

    FiMka Активный пользователь

    С нами с:
    12 май 2009
    Сообщения:
    66
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Я на основе вот этого скрипта http://art.thelib.ru/internet/game/razlichnie_vidi_autentifikacii_polzovateley_nanb_pvebsaytah.html (Аутентификация с использованием сессий) попытался написать свою, слегка измененную версию, к сожалению не работает :) Кто-нибудь может подсказать?

    Файлу authorize.php "передается" (захардкодено) логин и пароль, второй файл (somepage.php), по сути любая страница сайта.

    Полученные ошибки:
    authorize.php:
    PHP:
    1. <?php
    2.     $login = "guest";
    3.     $password = "d8578edf8458ce06fbc5bb76a58c5ca4";
    4.  
    5.     mysql_connect('localhost', 'root', 'qwe');
    6.     mysql_select_db('user');
    7.     $user_result = mysql_query("SELECT * FROM users WHERE login='$login' AND password='$password'");
    8.     if (mysql_error()) {
    9.         echo "Unable to connect to DB!";
    10.     } else if (mysql_num_rows($user_result) != 1) {
    11.         echo "Wrong user name or/and password!";
    12.     } else {
    13.         $user = mysql_fetch_assoc($user_result);
    14.         session_set_cookie_params(1800, "/");
    15.         session_start();
    16.         $_SESSION["user"] = $username;
    17.         header("Location: somepage.php");
    18.         if ( ! isset($_COOKIE["user"]) ) {
    19.             setcookie("user", $user, 1800, "/");
    20.         }
    21.     }
    22. ?>
    somepage.php:
    PHP:
    1. <?
    2.     unset($user);
    3.     $session_error = false;
    4.  
    5.     // IF no opened sessions
    6.     if ( ! isset($_COOKIE["user"]) ) {
    7.         $session_error = true;
    8.     } else {
    9.         // IF login or/and password are not set
    10.         if ( ! isset($user["login"]) || ! isset($user["password"]) ) {
    11.             $session_error = true;
    12.         } else {
    13.             session_set_cookie_params(1800, "/");
    14.             session_start();
    15.             $_SESSION["user"] = $username;
    16.         }
    17.     }
    18.     if ( ! $session_error ) { // IF login and pasword are set
    19.         // verify if the specified login and password are correct
    20.         mysql_connect('localhost', 'root', 'qwe');
    21.         mysql_select_db('user');
    22.         $user_result = mysql_query("SELECT * FROM users WHERE login='{$user[login]}' AND password='{$user[password]}'");
    23.         if (mysql_error() || @mysql_num_rows($user_result) != 1) { // IF  such user is not found
    24.             $session_error = true;
    25.         }
    26.     }
    27.     if ($session_error) { // IF user is not registered or no opened sessions
    28.         session_destroy(); // destroy sessions data
    29.         if ( ! isset($HTTP_COOKIE_VARS[session_name()]) )
    30.         setcookie(session_name(), "", "/");
    31.         header("Location: /login.php"); // open login page
    32.         exit();
    33.     }
    34.     mysql_free_result($user_result);
    35.     echo "You've authorized!";
    36. ?>
     
  10. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    somepage.php, на 6 строке $_COOKIE["user"] пустое, потому не срабатывает session_start(); на четырнадцатой строке, потому , естественно, session_destroy(); на 28 закрывать нечего и потому оно возвращает ошибку. Предложенный способ автризации - ужастен. Если хочешь, я выложу свой вариант.
     
  11. FiMka

    FiMka Активный пользователь

    С нами с:
    12 май 2009
    Сообщения:
    66
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Очень! :D
     
  12. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Тогда сейчас отдельную тему создам, если смогу до него добратся (у меня сейчас /home отмонтирован и с ним gparted работает).
     
  13. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Да, тебе повезло, я вчера как раз одной знакомой два файла нужных на мыло отправлял. В исходящих остались
     
  14. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
  15. FiMka

    FiMka Активный пользователь

    С нами с:
    12 май 2009
    Сообщения:
    66
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Большое спасибо! Буду вникать в эту реализацию. Последний вопрос, что думаешь по поводу вот этой реализации: http://www.php.ru/forum/viewtopic.p...er=asc&highlight=headers+already+sent&start=0.
    Выполнена не объектно, обоснование приведено, следует, по-моему, кодировать данные (в md5, например), а в целом очень понятная и достаточно удобная реализация.
     
  16. где? в базе чтоль? а смысл? ))
    Если у человека есть доступ к базе, шифрование паролей УЖЕ не спасет.
     
  17. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    FiMka, как на меня - грязновато. Но в общем то - вроде ничего так.
    Хешировать надо обязательно.

    флоппик, не спасет от чего?
    Представь. Взламывают сайт Вконтакте и получают доступ к базе. Половина пользователей используют один и тот же пароль к доступу ко всем сайтам.
    Вариант 1. Пароли не хешируются. У взломщиков на руках 10'000'000 паролей пользователей от большинства сайтов + емейлов
    Вариант 2. Пароли хешируются уникальной фукнцией (даже мд5 с солью). У взломщиков на руках остается управление только взломанным сайтом

    Надо беспокоится о своих пользователях и если твой сайт взломали - уменьшить риски для них