[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: вопрос по переменным SESSION
maximka787
Мужики, скажите пожалуйста, вот есть форма авторизации. Схема примерно такая:
$result = mysql_query("select from users where id=$id and password=$pass");
if (mysql_num_rows($result)>0 ){
$_SESSION['id'] = $id; //получаем переменную номера юзера
}
и на протяжении всех страниц идет проверка
if(isset($_SESSION['id'])){
echo "вы на сайте";
}

Это самый простой наверно способ авторизации. А вопрос вот в чем. Можно ли подменить эту сессионную переменную $_SESSION['id'], тк она важна не только на момент авторизации, но и также добавляет данные в таблицы sql как ключевое значение insert into.... where id=$_SESSION['id'];



Спустя 17 минут, 50 секунд (23.11.2010 - 13:02) sharki написал(а):
По идее нельзя, куки легко подменить или заменить, если захотят и сессию взломают))

Если тебя это так волнует, при идентификации юзера еще сделай его хеш и тоже занеси в сессионную переменную, а если прям уж сильно беспокоишься сделай так
$key = 'sffk2340xf'; // твой личный ключ, т.е сюда пишешь что хочешь он добавится к хешу
$_SESION['hash'] = sha1($_SESION['id']).$key;
// только не забудь, что в будущем при проверке придется присоединять пеерменную $key чтобы хеши сошлись...
//можешь эту пеерменную вынести куда подальше, а потом просто присоединять

Спустя 50 минут, 48 секунд (23.11.2010 - 13:53) maximka787 написал(а):
Цитата (sharki @ 23.11.2010 - 10:02)
По идее нельзя, куки легко подменить или заменить, если захотят и сессию взломают))

Как сломают? ((( ты серьезно? такое может быть разве? получается что если подменить сессию, то вообще вся система полностью уязвима, данные одного юзера могут влезть в данные другого, ходить можно без авторизации - это же крах.

Спустя 14 минут, 58 секунд (23.11.2010 - 14:08) sharki написал(а):
Ну если очень хороший продуманный хакер полезит, но это врядли) у тебя наверняка не самая крутая система и сайт не всемирной маштабности, сделай как я сказал и будет тебе двойная защита, т.е если хеш не совпадет, то и значит юзера подменили и т.д..

Спустя 1 час, 56 минут, 25 секунд (23.11.2010 - 16:04) Белый Тигр написал(а):
Не пугайте человека smile.gif Сессию можно подменить, но для начала её идентификатор нужно у пользователя как-то выкрасть.
Чтоб такого не происходило просто привязывайте сессию к IP. При авторизации заносите в сессию ($_SESSION['ip'] например) IP-адрес человека. И при каждом обращении к сайту сверяйте. Если IP разные- сессия угнана.
А проверка по id в вашем случае - вещь вполне пригодная.

Спустя 1 час, 7 минут, 3 секунды (23.11.2010 - 17:11) sharki написал(а):
а если у меня IP динамический?) сам у себя угоняю сессию?)

Спустя 45 минут, 11 секунд (23.11.2010 - 17:56) maximka787 написал(а):
Ребят, эта тема не особо из-за безопасности конкретного юзера) естественно я добавлю проверку либо ip либо хеш, такое я делал, но главная проблема чтоб данные заносились именно конкретному пользователю и чтобы не было ошибок, тоесть
insert into table values('','','','' where id= $SESSION[id];
это суета больше из-за допуска ошибок. Я не вижу другого способа как то утвердить/зарегить id пользователя, с которым он может работать на сайтах. Сессионная переменная подходит лучше всего.

Спустя 3 минуты, 17 секунд (23.11.2010 - 18:00) sharki написал(а):
Ну а че паришься то, делаешь проверку
if ($_SESION['hash'] == sha1($_SESION['id']).$key) {
insert into table values('','','','' where id= $SESSION[id];
}
else exit();


Только это нужно делать на серверной стороне, т.е ты с формы отправляешь все данные, т.е $hash = $_SESION['hash']; $id = $_SESION['id'];
А уже при приеме POST данных в обработчике проверяешь данные.

Спустя 6 минут, 29 секунд (23.11.2010 - 18:06) maximka787 написал(а):
это можно, только не так наверно подробно, а в начале сайта буду проверять)
if(isset($_SESSION['id'])  && $_SESION['hash'] == sha1($_SESION['id']).$key){
echo "вы на сайте";
// и дальше с чистой совестью используем переменные
}

Спустя 20 минут, 34 секунды (23.11.2010 - 18:27) sharki написал(а):
нет ты с самого начало при авторизации пользователя идентифицируешь сессии т.е


$_SESSION['id'] = $user_id
$_SESION['hash'] = sha1($user_id).$key

А потом уже с ними работаешь, и как хочеш ь проверяешь.
А то что ты написал, я заменю $_SESSION['id'] на свою переменную и она же заменится в sha1($_SESION['id']).$key

Спустя 2 часа, 43 минуты, 42 секунды (23.11.2010 - 21:10) ApuktaChehov написал(а):
Ребята, остановитесь! Какое хэширование!!! Если сессию угонят, никакое хэширование по поможет!

После авторизации добавляем в сессию user_id и идентификатор авторизации auth. А далее во всех скриптах проверяем, если auth существует, то зеленый свет, а если нет, то красный.

Сессию угнать можно только если сам автор сайта наделал в нем косяков. В остальных случаях, это настолько сложно, что если вы не владелец "Вконтакте" или т.д. никто и напрягаться не будет.

Что бы вы в сессию не записали, у нее есть свой id. Если этот id украдут, то у злого хацкера будет точна такая же сессия как и у вас, в месте с вашими хешами и т.д.

Так что выучите алгоритмы и не делайте ошибок и будет вам счастье.

Спустя 26 минут, 30 секунд (23.11.2010 - 21:37) maximka787 написал(а):
Цитата (ApuktaChehov @ 23.11.2010 - 18:10)
Так что выучите алгоритмы и не делайте ошибок и будет вам счастье.

Я не вижу особой уязвимости и в моем первоначальном коде, есть шанс что подменят что-то, но я раньше был уверен, что технически очень правильно написан код авторизации и проверки последующей (самый первый пост).

Спустя 28 минут, 26 секунд (23.11.2010 - 22:05) ApuktaChehov написал(а):
во первых: как у вас работает авторизация? Юзер свой id вводит или логин?
Во вторых: вот тут
mysql_query("select from users where id=$id and password=$pass");

Если мне удастся попасть в $id или $pass я жестоко ломану базу данных и возможно весь сервер целиком.
А вот так я этого не сделаю:
mysql_query("select from users where id='$id' and password='$pass'");


Почему? У вас есть мысли по этому поводу?

Спустя 9 минут, 51 секунда (23.11.2010 - 22:15) DySprozin написал(а):
;;Я не вижу особой уязвимости и в моем первоначальном коде
а особая и не нужна (; самая простая xss сведет на нет все труды по хешированию итд (;

нужна панацея? Тогда прекрасный вариант предложил Белый Тигр - привязка по IP. Да, есть недостаток - при динамическом IP придется заново вводить пароль, но сессия, добытая по XSS будет бесполезна (;

Итак, "можно ли подменить эту сессионную переменную" - да, точнее, можно украсть сессию (;
Есть ли панацея? Да, но Безопасность=1/(1072*Удобство).
Насколько безопасно использовать такую систему? Гораздо безопасней, чем в открытую логин/пароль держать в куках, однако, если нужна безопасность "высшей пробы" - см. совет Белого Тигра (;

Спустя 10 минут, 52 секунды (23.11.2010 - 22:26) ApuktaChehov написал(а):
DySprozin - ip тоже не панацея. Его подделать не так сложно.

Спустя 5 минут, 30 секунд (23.11.2010 - 22:32) DySprozin написал(а):
ApuktaChehov
а вот это глупости (; единственный способ подделать мой ip - это пробраться на мой комп (вирусом или физически) и установить на нем прокси-сервер (; ну... конечно, чисто в теории можно меня заманить на сайт, где сидит злобный эксплоит за сто баксов, обходящий последние версии антивирусов, однако, мы ведь не берем такие варианты? (;

Спустя 8 минут, 32 секунды (23.11.2010 - 22:40) ApuktaChehov написал(а):
DySprozin - любая информация приходящая от юзера, включая ip может быть ложной. Если я знаю ваш ip, то я могу передать его веб-серверу в качестве своего. Так что не надейтесь на это. При большом желании и такое дело обходится.
Во вы сейчас на сайте. Вы уверены, что на вашем чердаке, где установлен свитч провайдера, я не подложил сниффер? Если он там есть, то я знаю, все. Ваш ip, пароль, ваши куки, вашу сессию.

Так что судите сами...

Это, конечно, уже на пароною смахивает, но возможность все равно есть.

Спустя 6 минут, 59 секунд (23.11.2010 - 22:47) DySprozin написал(а):
ApuktaChehov
;;то я могу передать его веб серверу в качестве своего.
и что? первый же роутер обрубит левый ip, так что ответа вы никогда не дождетесь (;

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

Спустя 2 минуты, 54 секунды (23.11.2010 - 22:50) DySprozin написал(а):
Ну а паранойя со сниффером решается просто: ставим сайт на ssl (https) - и в сниффере получите вы такую абракадабру, что во век не разберете tongue.gif

Спустя 5 минут, 1 секунда (23.11.2010 - 22:55) ApuktaChehov написал(а):
DySprozin - читаете мои мысли. wink.gif

Спустя 1 минута, 6 секунд (23.11.2010 - 22:56) maximka787 написал(а):
where id=$id and password=$pass"
это схематично. понятно что уязвимо все, я для примера написал. Тут схема проста.
1. идет проверка на наличие записи в базе
2. если запись есть регистрируем переменную, в данном случае id ($_SESSION['id']) и работаем под данным номером. Проверка идет в данном случае! через номер и пароль. (если я использую логин и пароль я записываю две переменные сеанса userid и username: первая для внутренней работы сайта а вторая просто выводит имя везде, где надо)
$result = mysql_query("select from users where id=$id and password=$pass");
if (mysql_num_rows($result)>0 ){
$_SESSION['id'] = $id; //получаем переменную номера юзера
}

на всех страницах (абсолютно всех где нужна авторизация) простая проверка идет
if(isset($_SESSION['id'])){
echo "вы на сайте";
}

Некоторые, почему-то на всех страницах проверяют наличие записи в БД, я считаю, что достаточно один раз ее зарегить и использовать не нагружая лишний раз БД. Ну и для полной проверки придется записать IP в таблицу онлайн юзеров, чтобы проверять sid и id

Спустя 26 минут, 13 секунд (23.11.2010 - 23:22) DySprozin написал(а):
;;я считаю, что достаточно один раз ее зарегить и использовать не нагружая лишний раз БД
ИМХО, правильно считаешь (;


_____________
..Работает - не трогай!
Быстрый ответ:

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