$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) Белый Тигр написал(а):
Не пугайте человека Сессию можно подменить, но для начала её идентификатор нужно у пользователя как-то выкрасть.
Чтоб такого не происходило просто привязывайте сессию к IP. При авторизации заносите в сессию ($_SESSION['ip'] например) IP-адрес человека. И при каждом обращении к сайту сверяйте. Если IP разные- сессия угнана.
А проверка по id в вашем случае - вещь вполне пригодная.
Чтоб такого не происходило просто привязывайте сессию к 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 написал(а):
Ну а че паришься то, делаешь проверку
Только это нужно делать на серверной стороне, т.е ты с формы отправляешь все данные, т.е $hash = $_SESION['hash']; $id = $_SESION['id'];
А уже при приеме POST данных в обработчике проверяешь данные.
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
$_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 украдут, то у злого хацкера будет точна такая же сессия как и у вас, в месте с вашими хешами и т.д.
Так что выучите алгоритмы и не делайте ошибок и будет вам счастье.
После авторизации добавляем в сессию 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 вводит или логин?
Во вторых: вот тут
Если мне удастся попасть в $id или $pass я жестоко ломану базу данных и возможно весь сервер целиком.
А вот так я этого не сделаю:
Почему? У вас есть мысли по этому поводу?
Во вторых: вот тут
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*Удобство).
Насколько безопасно использовать такую систему? Гораздо безопасней, чем в открытую логин/пароль держать в куках, однако, если нужна безопасность "высшей пробы" - см. совет Белого Тигра (;
а особая и не нужна (; самая простая 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 - это пробраться на мой комп (вирусом или физически) и установить на нем прокси-сервер (; ну... конечно, чисто в теории можно меня заманить на сайт, где сидит злобный эксплоит за сто баксов, обходящий последние версии антивирусов, однако, мы ведь не берем такие варианты? (;
а вот это глупости (; единственный способ подделать мой ip - это пробраться на мой комп (вирусом или физически) и установить на нем прокси-сервер (; ну... конечно, чисто в теории можно меня заманить на сайт, где сидит злобный эксплоит за сто баксов, обходящий последние версии антивирусов, однако, мы ведь не берем такие варианты? (;
Спустя 8 минут, 32 секунды (23.11.2010 - 22:40) ApuktaChehov написал(а):
DySprozin - любая информация приходящая от юзера, включая ip может быть ложной. Если я знаю ваш ip, то я могу передать его веб-серверу в качестве своего. Так что не надейтесь на это. При большом желании и такое дело обходится.
Во вы сейчас на сайте. Вы уверены, что на вашем чердаке, где установлен свитч провайдера, я не подложил сниффер? Если он там есть, то я знаю, все. Ваш ip, пароль, ваши куки, вашу сессию.
Так что судите сами...
Это, конечно, уже на пароною смахивает, но возможность все равно есть.
Во вы сейчас на сайте. Вы уверены, что на вашем чердаке, где установлен свитч провайдера, я не подложил сниффер? Если он там есть, то я знаю, все. Ваш ip, пароль, ваши куки, вашу сессию.
Так что судите сами...
Это, конечно, уже на пароною смахивает, но возможность все равно есть.
Спустя 6 минут, 59 секунд (23.11.2010 - 22:47) DySprozin написал(а):
ApuktaChehov
;;то я могу передать его веб серверу в качестве своего.
и что? первый же роутер обрубит левый ip, так что ответа вы никогда не дождетесь (;
;;Если он там есть, то я знаю, все. Ваш ip, пароль, ваши куки, вашу сессию.
знаете мою сессию, но благодаря привязке по ip сделать с ней ничего не можете (; ну не обидно? (;
;;то я могу передать его веб серверу в качестве своего.
и что? первый же роутер обрубит левый ip, так что ответа вы никогда не дождетесь (;
;;Если он там есть, то я знаю, все. Ваш ip, пароль, ваши куки, вашу сессию.
знаете мою сессию, но благодаря привязке по ip сделать с ней ничего не можете (; ну не обидно? (;
Спустя 2 минуты, 54 секунды (23.11.2010 - 22:50) DySprozin написал(а):
Ну а паранойя со сниффером решается просто: ставим сайт на ssl (https) - и в сниффере получите вы такую абракадабру, что во век не разберете
Спустя 5 минут, 1 секунда (23.11.2010 - 22:55) ApuktaChehov написал(а):
DySprozin - читаете мои мысли.
Спустя 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 написал(а):
;;я считаю, что достаточно один раз ее зарегить и использовать не нагружая лишний раз БД
ИМХО, правильно считаешь (;
ИМХО, правильно считаешь (;
_____________
..Работает - не трогай!