Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > SESSION


Автор: APro 24.7.2008, 23:49
В очередной раз зравствуйте!

Моё изучение PHP продвигается семимильными шагами. Когда мне буду вручать Олимпийскую мидаль по программированию, я обязательно поблагодарю Vingrad, всех админов, ну и тех кто мне помогал... Ладно, об этом позже  smile 


Объясните пожалуйста мне, как вобще работать с сессиями. Как начинать, как заканчивать и всё, что может понадобится при написании какого-либо скрипта.

Если лень писать, то можно хотябы ссылки на статиь (желательно на русском).

Пошу не посылать меня в поиск, так как я там был... Но ничего тольком не понял. К сожалению...

--
Код

$first = "Заранее";
$second = " спасибо!"
$result = $first.$second;
echo $result;

 smile  smile 

Автор: Mal Hack 25.7.2008, 00:10
http://phpclub.ru/detail/article/sessions

Автор: APro 25.7.2008, 13:02
smile Я не понял как работают сессии. Вернее я понял, что можно передавать данные через них на другие страницы, но когда я это понял и начал делать авторизацию для сайта, я так и не допёр что через сессию нужно передовать... Можете кто-нибудь помоч?

Я посмотрел:
Код

<?php
session_start(); 
session_register("start"); 

if (!isset($login)){$login="";}
if (!isset($password)){$password="";}


if(!isset($_SESSION['start'])) {
if($login == 'login' && $password == 'pass' ) {
 $_SESSION['start'] = time();
} else {
 echo ("
  <FORM action=\"admin.php\" method=\"POST\">
  Логин: <INPUT type=\"text\" name=\"login\" value=\"".$login."\"><BR>
  Пароль: <INPUT type=\"password\" name=\"password\"><BR>
  <INPUT type=\"submit\" value=\"войти\">
  </FORM>
 ");
 exit;
}
}
?>


и окончательно запутался. Получается что если значения login и password верны, то в сессию записывается время, а если не верны, то форма ввода этих переменных.


Вобще, как сделать авторизацию с сессиями? (чтобы при заходе в index.php да и в любой другой скрипт было видно, что зашёл авторизированный пользователь)

Автор: Mal Hack 25.7.2008, 13:10
Предположим, есть исполняемая программа. EXE файл. Принцип, как она будет работать с конфигурационным файлом, INI например, представляете? Теперь кидаем эту программу в инет. Делаем INI файл для каждого пользователя (хранилище сессии). Теперь  надо пользователй различать. В Куку пишем SID - идентификатор сессии, т.е. привязываем его к конкретному  INI файлу. Если пользователь будет передавать SID, мы ьудем загружать данные из INI. Не будет передавать - не будем.

INI в данном случае - абстракция.
Сессия - просто реализация. Алгоритм авторизации можно глянуть тут: http://base.vingrad.ru/view/2711-Praktikum-Pishem-sistemu-Registratsii-Avtorizatsii

Автор: APro 25.7.2008, 13:39
Круто, только объясни мне, файл который ты приложил в конце, это уже можно использовать как модуль Регистрация/Авторизация?

Добавлено через 3 минуты и 19 секунд
Хм, и ещё, а как использовать этот файл? Ну, в том смысле что его можно просто include? Или как?

Автор: Mal Hack 25.7.2008, 13:44
Этот вопрос тут задают пару раз в месяц. Отвечаю. Если хотите чему-то научиться, смотрите на костяк, принцип работы. Если нет - копируйте, используйте, только потом не говорите, что у вас где-то там в скрипте косяк, где-то еще и т.п....
Файл рабочий на версии PHP<5

А как по вашему еще можно подключить файл? Нет, ну я могу, как один из альтернативных вариантов предложить eval(file_get_contents), но боюсь в этой ситуации он не сработает. Скорее всего не сработает...
include, конечно же.

Автор: Feldmarschall 25.7.2008, 13:48
Нет, не стоит.
Во-первых, там нет регистрации.
Во-вторых, там половина функций устарела (как и по первой ссылке, кстати).
В-третьих, использовать вообще ничего не надо. Если хочешь, чтобы работало, надо делать только самому. 

По поводу твоего кода.
Логика можно сделать попроще. Разделить авторизацию на два этапа.
Первый - проверка. 
Делается ЭЛЕМЕНТАРНО:
Код

<?
session_start();
if (!isset($_SESSION['login'])) {
?>
  Вы не авторизованы!M<br>
  <a href="login.php">авторизация</a>
<?
  exit;
}


Второй сводится к проверке логина и пароля, и - если успешно - записи логина в сессию.
Тоже не бином ньютона. Если вызывает трудности, то надо сначала потренироваться на создании гостевой книги

Автор: Mal Hack 25.7.2008, 13:52
Цитата(Feldmarschall @  25.7.2008,  14:48 Найти цитируемый пост)
Во-первых, там нет регистрации.

Обратите внимание на п.4, каркасом чего он является?

Автор: Feldmarschall 25.7.2008, 13:53
извините, ошибся =)

Автор: APro 25.7.2008, 13:58
Ну вобще то, пока я писал своё сообщение что не понимаю, я на самом деле начал понимать... Вернее мне пришла в голову мысль.

Короче, юзер ввёл логин и пароль - проверили. Если нашли в БД такой логин и пароль, то записываем в в БД хеш(логин+пароль+ip+секретное значение) и дальше через сессию передаем. (секретное значение - пусть будет там циферка или слово какое-нибудь)

Проверяем авторизован пользователь или нет:
Тот переданный хеш ищем в таблице, если найден, то пользователь есть. Выводим надпись "Привет, " + логин пользователя.

Ну и раскручиваем тему дальше...

Вобщем так можно сделать? (конечно можно, а из соображений по безопасности? Нельзя будет подделать сессию?)

Добавлено через 5 минут и 38 секунд
Почему-то при запуске qwe.php выскакивает ошибка:
Fatal error: Cannot redeclare hash() in C:\xampp\htdocs\nick\qwe.php on line 22
И ещё, в MySQL запросе:
Код

CREATE TABLE `auth_members` (
`id` SMALLINT NOT NULL AUTO_INCREMENT ,
`name` TINYTEXT NOT NULL ,
`password` TINYTEXT NOT NULL ,
PRIMARY KEY ( `id` ) 
);

CREATE TABLE `auth_sessions` (
`member` SMALLINT NOT NULL ,
`time` INT( 14 ) NOT NULL ,
`hash` TINYTEXT NOT NULL ,
);


Ошибка. Там же не должно быть запятой после `hash` TINYTEXT NOT NULL , в таблице `auth_sessions`

Автор: Mal Hack 25.7.2008, 14:13
Цитата(APro @  25.7.2008,  14:58 Найти цитируемый пост)
Короче, юзер ввёл логин и пароль - проверили. Если нашли в БД такой логин и пароль, то записываем в в БД хеш(логин+пароль+ip+секретное значение) и дальше через сессию передаем. (секретное значение - пусть будет там циферка или слово какое-нибудь)

Секретное значение - излишне... HTTP_USER_AGENT сюда можно для начала вставить.

Цитата(APro @  25.7.2008,  14:58 Найти цитируемый пост)
Fatal error: Cannot redeclare hash() in C:\xampp\htdocs\nick\qwe.php on line 22

Не поленитесь, вбейте в поиск. Два дня назад уже обсуждалось.

Цитата(APro @  25.7.2008,  14:58 Найти цитируемый пост)
Ошибка. Там же не должно быть запятой после `hash` TINYTEXT NOT NULL , в таблице `auth_sessions` 

mysql выдает ошибку?
Вот в качестве примера: 
Код
enum AAA {ONE, TWO, THREE};
enum BBB {ONE, TWO, THREE,};

Код на плюсах. Ни один компилятор вам даже варинга не выкинет. Код 100% рабочий, но если запятой не поставить, то, т.к. все элементы перечисления в процессе трансляции переводятся в int, то получим: 1, 2, 3 (в ААА), 4,5,6  в BBB (это если запятую поставить)... Если нет, то будет 1, 2, 3 и 1, 2, 3...

Автор: Feldmarschall 25.7.2008, 15:13
APro, не нужно ничего в бд писать. у тебя сессия есть для этого.
секретничать тоже не нужно. можешь написать логин, или id - в общем, что нужно для идентификации пользователя.
И ВСЕ.
сессии - это очень просто. не надо пытаться делать их сложнее ,чем они есть

Добавлено через 9 минут и 20 секунд
Казалось бы, авторы пхп сделали работу с сессиями простой до предела - одна-единственная переменная, $_SESSION. Присвоил значение его элементу - положил в сессию. Прочитал элемент - достал из сессии. 
Не забыть еще session_start().
ВСЁ! 
Две строчки!
И все равно люди умудряются в этих двух соснах заблудиться.

Автор: APro 27.7.2008, 17:53
а если например в сессии хранить просто ID, то получается, что его можно подделать. Если например злоумышленник узнает ид админа, то у него будут права, так ведь? (или просто сессию нельзя подделать?)

Я читал, что сессию можно подделать и тогда хана... (или это только когда куки используешь?)

А сессия делается так, как я понимаю:
Код

<?php 
    session_start(); 
    $_SESSION['sname'] = 'id'; 
?>


А на остальных скриптах проверять сессию sname с ID'ом, и если такой есть в БД, то тогда убирать форму ввхода и писать Welcome сообщение?

Автор: Mal Hack 27.7.2008, 18:11
ID сессии пишется в куку и передается пользователю. При каждом обращении к скрипту кука передается. Вот ее подделать можно.
Для этого вы и должны делать проверку, на то что пользователь именно тот, кто вам нужен. Самый простой вариант сравнивать USER_AGENT, IP пользователя, его имя с где-ть сохраненным. Естественно зашифрован.

Автор: Feldmarschall 27.7.2008, 19:20
Цитата(APro @  27.7.2008,  17:53 Найти цитируемый пост)
Я читал, что сессию можно подделать 

А я читал, что инопланетяне похитили президента, а Киркорова родила двойню. 
Надо не только читать, но и думать. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)