[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вопрос о Сессиях
Страницы: 1, 2
Dno
Здравствуйте. С первых дней изучения PHP меня интересовал один вопрос, и до сих пор руки не доходили спросить про это. Так вот.

Есть форма авторизации зарегистрированных пользователей. Человек вводит ЛОГИН и ПАРОЛЬ, если верно то ему в сессию auth заноситься его login.

А теперь представим есть форма добавления новостей на сайт, и она предназначена только для зарегистрированных пользователей, и видна только для авторизованных. А вот и реализация такой идеи, которое вызывает у меня некое недоверие:

    // Так как она инклюдиться, запрещаем прямой доступ к файлу add.php
<? defined('DNO') or die('Доступ запрещен');?>

// Если существует сессия с логином, покажи форму, иначе выведи сообщение
<? if(isset($_SESSION['auth']['login'])): ?>
<h1>Добавить новость</h1>
<
form action="" method="post" enctype="multipart/form-data">
// Тут инпуты, сабмиты...
</form>
<? else: ?>
<?=
'Добавлять статьи могут только зарегистрированные пользователи'?>
<?
endif; ?>
</div>


Эффективно ли это? Может ли человек занести в сессии что-то своё? В общем что знаете, расскажите пожалуйста.

Спасибо.
AllesKlar
В сессию никто и ничего свое занести не может. Можно только у кого-нибудь украсть куки и воспользоваться его сессией.

Нет смысла хранить в сессии логин, более уместно хранить там id юзера.
Это существенно упростит работу с базой, где это касается данного юзера.

if(isset($_SESSION['auth']['login']))

это проверка на существование сессии, а не на наличие там логина (или id)
В случае сессии, как раз уместнее использовать empty(), тогда там можеть ничего не быть, быть несуществующий юзер с id = 0, быть false, null и все это будет означать, что пользователь не залогинился.

_____________
[продано копирайтерам]
I++
Ну тут на самом деле вопрос огромный, например: читаем https://www.owasp.org/

Раздел например: https://www.owasp.org/index.php/Category:Attack

А насчет

$_SESSION['auth']['login']


Ну тут можно написать так:

$_SESSION['auth']['login'] = 'Вася';
$_SESSION['auth']['loggedin'] = true;

if($_SESSION['auth']['loggedin'])
echo 'вы авторизованы';
else
echo 'авторизуйтесь';


Вообще в целом нормально.
AllesKlar
I++
Зачем учишь плохому?
Можно написать по-разному, можно даже хеш логина хранить, а потом, чтобы обратиться в базу по id юзера, сначала расшифровать значение из сессии.

Какой смысл авторизации вообще? Чтобы иметь доступ к данным, принадлежащим определенному юзеру. Данные с юзером связаны как? По id юзера. Что хранить в сессии? Id.

_____________
[продано копирайтерам]
Dno
Цитата
это проверка на существование сессии, а не на наличие там логина

Ну при авторизации в сессию auth->login заноситься логин авторизованного пользователя, при нажатии кнопки выход сессия auth полностью уничтожается.

Т.е. if ISSET означает, если существует сессия auth->login (тоже самое, ЕСЛИ СУЩЕСТВУЕТ ЛОГИН) покажи форму, иначе...

Т.е. сессия есть, значит есть и Логин, следовательно это проверка на наличие Логина в Сессии. Разве не так? Просто если логически все нормально, стоит-ли делать еще проверки в коде?

I++, Благодарю за ссылки.
Dno
user posted image

Вот пример моей авторизации, не будет Логина если (т.е. человек не авторизовался), то не будет и auth->login сессии, и форма будет недоступна.
AllesKlar
Dno
как сессию удаляешь?

_____________
[продано копирайтерам]
Dno
AllesKlar, Функцией unset.

// Выход пользователя
if(isset($_GET['do']) == 'logout'){
logout();
}


// Выход пользователя
function logout(){
if($_GET['do'] == 'logout')
unset($_SESSION['auth']);
header('Location: '.$_SERVER['HTTP_REFERER']);
}
I++
Сессию уничтожают так: http://php.net/manual/ru/function.session-destroy.php

Если проект на полтора анонимуса, то сойдет. А так методом GET нельзя менять состояние, им можно только получать данные, все остальное должно проходить методом POST, с проверкой csrf токена.

https://www.owasp.org/index.php/Cross-Site_...gery_%28CSRF%29

Вот почему:

user posted image

Смотри скрытый текст, почему так делать нельзя. У метода GET тоже есть свои болезни, особенно если json используется, все любят json, а злые дяди любят https://www.owasp.org/index.php/OWASP_AJAX_...cript_Hijacking
Dno
I++, Спасибо за информацию о CSRF-атаках. Изучаю...
I++
По поводу MySQL, http://habrahabr.ru/post/165069/ для начала пойдет.
В html5 кстати тоже начинает потихоньку в DOMик кое, что приходить связанное с выводом данных, чтобы не было xss и не пользоваться костылем в виде htmlentities, specialchars и тд. Но пока очень криво все.
Guest
Специально спросил, как уничтожает сессию именно потому, что:
	session_start();

$_SESSION['test'] = 123;
var_dump(isset($_SESSION['test']['123']));

session_destroy();
var_dump(isset($_SESSION['test']));

и на выходе:
boolean true
boolean true

session_destroy() уничтожит файл сессии на сервере, но суперглобальный массив $_SESSION будет до окончания скрипта сохранять все значения.
Чтобы правильно убить сессию, нужно чистить и сам массив $_SESSION или уничтожать его элементы.

Dno именно из-за этих грабель я и рекомендовал тебе использовать id, и не гадать дальше на кофейной гуще isset сессия или не isset
Прописал в сессию false, сравнил с empty() и живи дальше спокойно.

Но.. как гриться... опытные люди потому и оптыные, что учаться на своих ошибках.
AllesKlar
как интересно меня выкинуло smile.gif I++ шпана smile.gif псссс админы, куда смотрим? У вас дырявка в безопасности, I++ тупо сообщением выкидывает порядочных пользователей.
В общем предыдущий пост мой.

_____________
[продано копирайтерам]
I++
Цитата
AllesKlar


Примером выше я продемонстрировал ошибку в архитектуре приложения которые допустили разрабы. Методом GET нельзя менять состояние, подробнее в инете RFC бла бла какой то там не помню какой, я уже упоролся, ночь же. Насчет сессии, там такая же фигня после вызова session_destroy, по правильной логике приложение не должно пытаться получать доступ к переменной $_SESSION, оно должно вывести страничку например с текстом: вы вышли, либо подгрузить страницу с логином и паролем или перекинуть в корень / . В общем там как разрабу угодно будет. Каждый же знает, что нельзя хедеры посылать после контента, так и тут, только с хедерами ошибка вылезет, а тут логическая ошибка будет, которую пых не отлавливает. Да и лишний это оверхед.

Еще по поводу GET, примером выше я эмулировал спойлер, обычной картинкой подогнанной под фон, а поверх вставил ссылку:

URL http://phpforum.su/index.php?act=Login&CODE=03]IMG]http://i67.fastpic.ru/big/2014/1106/2e/750c6b944bf800eac9aaa7f6325cf02e.png/IMG]URL]


С тем же успехом, можно в уязвимом веб скрипте другим юзерам в личку слать например картинку и сказать смотри какие милые котики или еще чего. Так же при определенных условиях можно выкрасть сессию и даже если она защищена например по IP адресу

$_SESSION['user_ip'] = '192.168.0.123';

Можно всегда подключиться к говнопровайдеру, и послать глухой запрос с IPишником юзера, определив его IP по пикселю или заставив загрузить картинку с хоста example.com. Вообще щас этот метод не сильно канает, провайдеры научились нанимать грамотных админов, а не школоту всякую, но бывают исключения.

и приложение отработает и мы получим то, чего желали, а юзер даже знать не будет, что произошло и подумает, да классные котики :D

Поэтому и нужен csrf токен. Выцепить токен из формы сложновато, а вот куку попроще.
А если сессию вытащить нельзя, всегда можно сделать iframe автосабмитную форму.

Вообще я особо не ковырял, да и незачем, в теории можно ссылку на логаут вообще автоматической сделать и как только кто-нибудь посетит страничку, его тут же выкенет :D

Вот сейчас глянул своим красным глазом на форум, уже нашел несколько дырок csrf с виду, не тестил, но думаю прокатит. Да и постить их не буду, админ не одобрит. Да и форум живет уже давно и никто его вроде и не шатал, да и пусть дальше не шатает никто, тут уютно)
Dno
AllesKlar
session_start();

// Сессия есть допустим.
var_dump(isset($_SESSION['auth']['login']));

unset($_SESSION['auth']);
var_dump(isset($_SESSION['auth']));


И на выходе:

boolean true
boolean false


И сам массив $_SESSION уничтожаеться.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.