Защита аутентифицированного сеанса PHP от перехвата сеанса с помощью перехвата пакетов

Меня интересует вопрос защиты сеансов PHP без использования SSL.

К моему удивлению, если посредник перехватывает пакеты, которыми обмениваются пользователь и сервер, очень легко украсть сеанс, даже если он аутентифицирован. Я знаю, что есть некоторые тактики для ограничения ущерба, такие как изменение sessionid при входе/выходе из системы, запись/проверка системных параметров пользователя (например, ОС, браузер).

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

Я подумал о возможном решении, когда во время аутентификации входа в систему, которая зашифрована, сервер может отправить клиенту случайный пароль сеанса. Пароль сеанса будет действителен только во время этого сеанса входа в систему. Таким образом, каждое сообщение, которым обменивались во время этого сеанса, должно было быть подписано с использованием пароля сеанса (например, MD5 (пароль сеанса + содержимое сообщения)).

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


person Leaurus    schedule 06.06.2012    source источник
comment
Без обид, но рассмотрите возможность использования SSL... это может стоить около 49-100 долларов в год, но это намного дешевле, чем платить разработчикам за поддержку пользовательского security scheme   -  person Andreas Wong    schedule 06.06.2012
comment
+1. Кроме того, @João Salada, как случайный пароль сеанса будет отправлен без SSL?   -  person ziad-saab    schedule 06.06.2012
comment
не в обиду! ;) Я просто хочу развивать свой блог с нуля, чтобы понять основные проблемы, подобные этой. но использование ssl — это огромное излишество, когда вам не нужна конфиденциальность (мое мнение). Эта схема, о которой я думал, кажется очень простой... Вот почему я хотел спросить, решает ли она проблему или она ошибочна.   -  person Leaurus    schedule 06.06.2012
comment
Помимо конфиденциальности, SSL обеспечивает целостность данных (не изменяется при передаче данных). Вы должны использовать его.   -  person Raptor    schedule 06.06.2012
comment
Я понимаю вопрос zi42. Если «человек посередине» перехватывает ответ клиента на вход в систему, он все равно может выдать себя за клиента. и сервер отправит сеансовый пароль не тому парню, верно? Однако он должен знать пароль клиента...   -  person Leaurus    schedule 06.06.2012


Ответы (2)


Предлагаемое вами решение для "подписания" требует поведения на стороне клиента, поэтому вам нужно приложение на стороне клиента, которое может выполнять подписание.

Если вы пишете апплет Flash/Java/Unity или какой-либо из этих плагинов, вы можете следовать своему плану, поскольку вы можете более точно контролировать клиент и добавлять процедуры для подписи.

Но я предполагаю, что вы отправляете HTML-страницы в браузер без использования плагина? Если это так, у вас есть два варианта, на самом деле. Первый - это SSL (который вы исключаете), поскольку он встроен в браузер. Второй — Javascript. Для максимальной безопасности нужно как-то имитировать SSL, в том числе с хранением на стороне клиента шифровального (открытого) ключа/алгоритма (чтобы они никогда не путешествовали вместе с сообщениями). Вы хотели бы максимально приблизиться к общедоступному/закрытому ключу + рукопожатию SSL, что немаловажно. Как предложил sarnold, вам нужен надежный ключ шифрования. Посетите http://www.jcryption.org/ в качестве примера — другие появляются при поиске в Google.

Если это немного чрезмерно, вашим наиболее жизнеспособным решением, вероятно, будет согласование более простого алгоритма шифрования с использованием JS: вы отправляете «ключ», сохраняете «ключ» в файле cookie в браузере, все коммуникации через AJAX, и вы создаете более простой механизм подписи на основе этого ключа (плюс, возможно, еще одна переменная, которой клиент поделился с вами во время первоначального рукопожатия). Все, что не декодирует или не соответствует ключу, затем завершает весь сеанс и начинается снова.


sarnold имеет хорошие моменты в своем ответе, что следует избегать md5 и SHA-1; а некоторые даже считают, что SHA256 подходит для современных компьютеров, но, учитывая, что вам нужно реализовать решение на JS, для скорости вы можете быть привязаны к чему-то столь же «маленькому» (моя аналогия), как md5. Таким образом, ваша лучшая защита от этого — точное ведение журнала и обнаружение грубой силы/ошибки. Любые искаженные сообщения (и вы можете проверить их на любом конце) должны регистрироваться и отслеживаться. Слишком много сбоев, и IP-адрес будет забанен — и продолжайте логирование.

person Robbie    schedule 06.06.2012
comment
Я думал о втором варианте, и этот сайт как раз то, что я хотел. ;) Проблема с подходом с открытым/закрытым ключом, который является частью схемы SSL и TLS, заключается в том, что для этого требуется подписанный сертификат, который стоит дорого. Если, с другой стороны, вы используете сертификат, не подписанный этим verisign и т. д., браузер вернет вам большое предупреждение, и большинство людей уйдут. это для моего блога... - person Leaurus; 06.06.2012
comment
Сертификаты можно приобрести всего за 20 долларов в год. Пример: hostnexus.com/solutions/certificates-compare.php. Единственная разница в ценах - это страховки и гарантии, которые идут с ними, на самом деле. Вы потратите гораздо больше, пытаясь заставить работать решение без SSL. Но если идти в одиночку, рад, что смог помочь. - person Robbie; 06.06.2012

Вы бы хотели использовать что-то вроде HMAC вместо более простого MD5 — и вы бы хотели использовать SHA256 или выше, поскольку известно, что MD5 имеет слабые места, и SHA-1 тоже начинает чувствовать себя слабым.

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

Поэтому вам нужно добавить в протокол nonce.

Могут быть и другие проблемы — в конце концов, TLS теперь находится в версии 1.2 после трех итераций SSL. Просто придерживайтесь TLS и будьте счастливы.

person sarnold    schedule 06.06.2012
comment
Да, MD5 уязвим для префиксных атак. Я использовал MD5 в качестве примера. Но все равно спасибо. Просто хотел узнать, есть ли у схемы какие-то преимущества. а насчет nonce вы абсолютно правы. Спасибо ;) - person Leaurus; 06.06.2012