Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Basic аутентификация или сессии что лучше
 
 автор: tvv123456   (20.12.2009 в 04:22)   письмо автору
 
 

Вообщем с заказчиком возникла проблема, он считает что сессии безопаснее basic-аутентификации. По его просьбе прикрепил к этому всему айпи. Вот что получилось(в части басик аутентификации(за сессии вообще браться не хочу))

<?
function GetRealIp() // определение ip пользователя
{
  
$strRemoteIP $_SERVER['REMOTE_ADDR'];  
 if (!
$strRemoteIP) { $strRemoteIP urldecode(getenv('HTTP_CLIENTIP'));}   
 if (
getenv('HTTP_X_FORWARDED_FOR')) { $strIP getenv('HTTP_X_FORWARDED_FOR'); }  
 elseif (
getenv('HTTP_X_FORWARDED')) { $strIP getenv('HTTP_X_FORWARDED'); }  
 elseif (
getenv('HTTP_FORWARDED_FOR')) { $strIP getenv('HTTP_FORWARDED_FOR'); }  
 elseif (
getenv('HTTP_FORWARDED')) { $strIP getenv('HTTP_FORWARDED'); }  
 else { 
$strIP $_SERVER['REMOTE_ADDR']; }   
 if (
$strRemoteIP != $strIP) { $strIP $strRemoteIP.", ".$strIP; }  
 return 
$strIP;
}
$ip "тут айпишник";
if(
GetRealIp() != $ip){exit('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /><title>Не совпали айпи</title>
</head><body>IP не совпадает</body></html>'
);}
$db mysql_connect ("","","");//подключение к базе
mysql_select_db("base",$db);
if (!isset(
$_SERVER['PHP_AUTH_USER']))

{
        
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
            
Header ("HTTP/1.0 401 Unauthorized");
            
        exit();
}

else {
        
                
$_SERVER['PHP_AUTH_USER'] = mysql_escape_string($_SERVER['PHP_AUTH_USER']);
                
$_SERVER['PHP_AUTH_PW'] = md5(mysql_escape_string($_SERVER['PHP_AUTH_PW']));
     

        
$query "SELECT id,pass FROM admin WHERE user='".$_SERVER['PHP_AUTH_USER']."'";
        
$lst = @mysql_query($query);

        if (!
$lst)
        {
        
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
        
Header ("HTTP/1.0 401 Unauthorized");
        exit();
        }

        if (
mysql_num_rows($lst) == 0)
        {
           
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
           
Header ("HTTP/1.0 401 Unauthorized");
           exit();
        }

        
$pass =  @mysql_fetch_array($lst);
        if (
$_SERVER['PHP_AUTH_PW']!= $pass['pass'])
        {
            
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
           
Header ("HTTP/1.0 401 Unauthorized");
           exit();
        }
$dostup $pass['id']; //тут определяем что за пользователь и даем ему соответствующие права

}


Клиент говорит что он работает в локальной сети из примерно еще 200 машин, все эти машины имеют выход в инет через обычный adsl. Вообщем заказчик очень боиться "сниферов" как он выразился(кражи данных в пределах текущей сессии). Требует чтоб я сделал аутентификацию по сессии.
Но(как мне кажеться) идентификатор сессии утащить гораздо проще из кук и даже если я прикручу по айпи админа, то это не даст результата так как остальные компьютеры находящиеся в этой локалке будут иметь тот же айпишник при выходе в инет(один adsl на всех)
Если я не прав обьясните пожалуйста в чем, если я прав докажите пожалуйста клиенту почему(в дальнейшем дам ссылку на этот топик)

  Ответить  
 
 автор: Николай2357   (20.12.2009 в 10:34)   письмо автору
 
   для: tvv123456   (20.12.2009 в 04:22)
 

Если клиент боится сниферов, то нужен совсем не этот механизм. И сессии тут вообще непричем. Нужно шифровать или хэшировать данные на стороне клиента, тогда перехват станет бесполезен.

  Ответить  
 
 автор: Саня   (20.12.2009 в 11:08)   письмо автору
 
   для: Николай2357   (20.12.2009 в 10:34)
 

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

  Ответить  
 
 автор: Николай2357   (20.12.2009 в 12:12)   письмо автору
 
   для: Саня   (20.12.2009 в 11:08)
 

Хеш сам по себе не представляет ценности
К чему это сказано?

А реализовывать шифрование на клиенте глупо, так как вся логика шифрования открыта.
Это смотря как шифровать. SSL тоже шифрует. Другой вопрос что хэшировать легче. Хотя не всегда надежнее.

  Ответить  
 
 автор: Саня   (20.12.2009 в 12:44)   письмо автору
 
   для: Николай2357   (20.12.2009 в 12:12)
 

Какой смысл от хеша в данном случае?

Хеш не является заменой шифрованию. Это, по сути, разные технологии для разных задач.

  Ответить  
 
 автор: Николай2357   (20.12.2009 в 15:02)   письмо автору
 
   для: Саня   (20.12.2009 в 12:44)
 

Какой смысл от хеша в данном случае?
Человек боится, что у него перехватят данные, как какой смысл? Такой же как и везде, не дать жулику возможности узнать их.

Хеш не является заменой шифрованию. Это, по сути, разные технологии для разных задач.
Я знаю, что не является. И знаю что для разных. Однако в данном случае задачу можно решить обоими способами.

  Ответить  
 
 автор: Саня   (20.12.2009 в 16:01)   письмо автору
 
   для: Николай2357   (20.12.2009 в 15:02)
 

> Человек боится, что у него перехватят данные, как какой смысл?
По-вашему данными, нуждающимися в защите, является только пароль?

  Ответить  
 
 автор: Николай2357   (20.12.2009 в 16:46)   письмо автору
 
   для: Саня   (20.12.2009 в 16:01)
 

В контексте данного вопроса - да.

  Ответить  
 
 автор: Саня   (20.12.2009 в 16:51)   письмо автору
 
   для: Николай2357   (20.12.2009 в 16:46)
 

В контексте данного вопроса заказчик хочет получить защиту всех данных, передаваемых между сервером и компьютером клиента.
Надеюсь не нужно объяснять что такое сниффинг и почему хеширование пароля ему не помешает? Система аутентификации никак не может решать задачу защиты данных.

  Ответить  
 
 автор: Николай2357   (20.12.2009 в 17:25)   письмо автору
 
   для: Саня   (20.12.2009 в 16:51)
 

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

  Ответить  
 
 автор: Fractured#   (20.12.2009 в 17:30)   письмо автору
 
   для: Николай2357   (20.12.2009 в 17:25)
 

[поправлено модератором]

  Ответить  
 
 автор: Николай2357   (20.12.2009 в 18:11)   письмо автору
 
   для: Fractured#   (20.12.2009 в 17:30)
 

Я не трудный, просто иногда не понимаю, зачем пытаться исковеркать мои ответы. И тем более придавать им статус глупых.
В вопросе топикстартера небыло ни слова про защиту данных, не относящихся к аунтификации. И SSL здесь может оказаться совершенно излишним, тем более он платный.
Допустим это панель администрирования, где совершенно не важна информация как таковая, а важен именно доступ к скрипту, изменняющему эти данные. Сниффинг тут не имеет никакого смысла, если невозможно получить пароль доступа.

  Ответить  
 
 автор: Саня   (20.12.2009 в 18:15)   письмо автору
 
   для: Николай2357   (20.12.2009 в 18:11)
 

SSL не платный. Чтобы сгенерировать сертификат, особых знаний, за которые нужно платить, не потребуется.

  Ответить  
 
 автор: Саня   (20.12.2009 в 18:03)   письмо автору
 
   для: Николай2357   (20.12.2009 в 17:25)
 

Ладно. Попробую объяснить на пальцах.

Вот я перехватил хеш пароля.
Захожу на страницу логина, отключаю JS, ввожу логин, перехваченный хеш...
И что дальше произойдёт?

  Ответить  
 
 автор: Николай2357   (20.12.2009 в 18:22)   письмо автору
 
   для: Саня   (20.12.2009 в 18:03)
 

Это зависит от реализации. Смотря как хэшировать. Допустим с солью, со случайной строкой, которая действует в пределах данной сессии. Следующий ввод этого хэша ничего не даст, потому что он состоит из двух частей - серверной и клиентской. И если серверную можно перехватить, то клиентскую уже нет.

  Ответить  
 
 автор: Саня   (20.12.2009 в 18:42)   письмо автору
 
   для: Николай2357   (20.12.2009 в 18:22)
 

Тогда прийдётся хранить пароли в открытую. А это потенциально опасно. Особенно со стороны вполне невинных администраторов базы данных. Ведь часто люди используют один пароль на все сервисы. Порой достаточно получить доступ к основному мылу, на которое можно "Забыть пароль" во всех интересующих сервисах.

  Ответить  
 
 автор: Николай2357   (20.12.2009 в 19:00)   письмо автору
 
   для: Саня   (20.12.2009 в 18:42)
 

Тогда прийдётся хранить пароли в открытую.
Не факт. Точно так же можно хранить и хэш.
Я же говорю, все зависит от потребностей. возможностей и вообще конкретных условий. Использовать HTTPS для сокрытия пароля как минимум нерентабельно, даже если не покупать сертификат, а слепить самому. Просто по скорости.
А если там действительно есть что прятать, то тогда да. Может и этого протокола нехватить))

  Ответить  
 
 автор: Саня   (20.12.2009 в 19:10)   письмо автору
 
   для: Николай2357   (20.12.2009 в 19:00)
 

Если соль не меняется при каждой аутентификации, то тогда нет смысла городить этот огород. Опять же, снифаем соль, хеш. Подставляем эти данные в форму и вуаля!

Но если соль изменяется, тогда обязательно нужно знать пароль. Или любую другую строку, дающуюю коллизию с паролем :).

  Ответить  
 
 автор: Николай2357   (20.12.2009 в 19:11)   письмо автору
 
   для: Саня   (20.12.2009 в 19:10)
 

Ну а чем хэш пароля не коллизия? Зачем именно в явном виде хранить?

  Ответить  
 
 автор: Саня   (20.12.2009 в 19:18)   письмо автору
 
   для: Николай2357   (20.12.2009 в 19:11)
 

Коллизия — это строка (или не строка), не совпадающая с исходной, и дающая такой же хеш как и исходная строка. Вероятность нахождения этой строки микроскопическая.

> Зачем именно в явном виде хранить?
Вот примерный алгоритм использования изменяемых солей:

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

  Ответить  
 
 автор: Николай2357   (20.12.2009 в 19:57)   письмо автору
 
   для: Саня   (20.12.2009 в 19:18)
 

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

Вот и вся коллизия.

  Ответить  
 
 автор: Саня   (20.12.2009 в 19:39)   письмо автору
 
   для: Николай2357   (20.12.2009 в 19:00)
 

> Использовать HTTPS для сокрытия пароля как минимум нерентабельно
В чём же нерентабельность?

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

  Ответить  
 
 автор: Николай2357   (20.12.2009 в 19:59)   письмо автору
 
   для: Саня   (20.12.2009 в 19:39)
 

Нерентабельность в скорости и трафике, я же написал. Если данные не приватны, то нет смысла пользовать такой неповоротливый протокол.

  Ответить  
 
 автор: Саня   (20.12.2009 в 20:03)   письмо автору
 
   для: Николай2357   (20.12.2009 в 19:59)
 

Откуда такие данные?

  Ответить  
 
 автор: Николай2357   (20.12.2009 в 20:10)   письмо автору
 
   для: Саня   (20.12.2009 в 20:03)
 

В смысле неприватные?))) Ну ведь реально медленный протокол, неужели и это будет оспариваться....

  Ответить  
 
 автор: Саня   (20.12.2009 в 20:16)   письмо автору
 
   для: Николай2357   (20.12.2009 в 20:10)
 

В смысле про траффик и медлительность.

> Ну ведь реально медленный протокол, неужели и это будет оспариваться....
Что-то я не замечаю этих эффектов при работе с gmail.

  Ответить  
 
 автор: Николай2357   (20.12.2009 в 20:22)   письмо автору
 
   для: Саня   (20.12.2009 в 20:16)
 

А я очень замечаю. Причем на столько, что нервов нехватает. Это наверное еще от каналов зависит и провайдера. Но факт есть факт. В любом случае на шифрование страницы требуется время.

  Ответить  
 
 автор: Саня   (20.12.2009 в 11:13)   письмо автору
 
   для: tvv123456   (20.12.2009 в 04:22)
 

Предложите ему SSL.

  Ответить  
 
 автор: Саня   (20.12.2009 в 17:59)   письмо автору
 
   для: tvv123456   (20.12.2009 в 04:22)
 

Напишите заказчику вот что:

При использовании basic аутентификации логин с паролем передаются открытым текстом в каждом запросе к серверу.
При аутентификации на сессии, логин с паролем передаются один раз в начале сессии и назначается некий идентификатор, по которому сервер определяет кто к нему пришел за очередным запросом.

В обоих случаях передаваемые аутентификационные данные, что логин-пароль в basic, что идентификатор сессии, никак не шифруются и злоумышленнику достаточно отснифать ОДИН запрос клиента (любой в basic'е или первый при сессиях), чтобы получить логин-пароль (и как бонус — идентификатор сессии, позволяющий здесь и сейчас влезть в сессию... если она ещё жива, конечно). Это фатально что в одном, что в другом случае.

Очевидно, что basic аутентификация сосёт, так как данные передаются открыто в каждом запросе.

Но даже если менять пароль каждую минуту или придумать хитронакрученную систему аутентификации, это не спасёт. Потому что сниффер будет складывать себе все данные, передающиеся между целевым клиентом и сервером. А так как они не шифрованные, то злоумышленник увидит содержимое всех страниц, которые вы посещали.

Выходом из этой ситуации может стать использование SSL.

  Ответить  
 
 автор: tvv123456   (20.12.2009 в 18:43)   письмо автору
 
   для: Саня   (20.12.2009 в 17:59)
 

Вот про SSL и хотел услышать. Пытался убедить, что это лучшее решение, но мне не очень верили.
Спасибо за ответ.

P.S. Клиент нашел сам способ защититься от злоумышлеников в локалке(купил три джи модем) и выходит в админку только с него отключившись от локалки :)))

  Ответить  
 
 автор: Саня   (20.12.2009 в 18:44)   письмо автору
 
   для: tvv123456   (20.12.2009 в 18:43)
 

Сурово.

  Ответить  
 
 автор: Саня   (20.12.2009 в 18:53)   письмо автору
 
   для: tvv123456   (20.12.2009 в 18:43)
 

Можно усилить его паранойю. Пусть в коммандной строке выполнит
tracert example.com
И увидит в скольких точках возможен сниффинг его данных :)

* Вместо example.com нужно поставить домен, на котором находится админка

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования