Можно ли точно определить IP-адрес клиента в сервлете Java - PullRequest
6 голосов
/ 17 февраля 2012

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

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

Например, если мой сервер настроен на доверие 192.168.0.1, тогда возможно ли другим клиентом, кроме 192.168.0.1, выдать себя за 192.168.0.1 и обмануть мой механизм аутентификации?

Ответы [ 5 ]

17 голосов
/ 17 февраля 2012

Вы можете использовать метод getRemoteAddr() из класса HttpServletRequest для получения IP-адреса.Будьте осторожны, хотя.Если ваш клиент находится за прокси-сервером (или даже межсетевым экраном NAT), вы получите вместо него IP-адрес прокси.

Итак, вы также можете найти HTTP-заголовок X-Forwarded-For (стандартный дляопределение исходного IP-адреса клиента за HTTP-прокси).Подробнее на Википедии .Будьте осторожны, хотя.Если ваш клиент НЕ находится за прокси, вы можете получить нулевой заголовок XFF.Итак, если вы хотите следовать по этому пути, вы должны использовать сочетание методов сервлета и оценки заголовка XFF.Однако нет гарантии, что прокси-сервер перенаправит вам заголовок.

Но имейте в виду, что IP-адрес источника может быть легко изменен или подделан любым вредоносным клиентом.Я действительно рекомендую использовать какую-либо клиентскую аутентификацию (например, сертификат).Веб-приложение не может точно определить IP-адрес клиента.

7 голосов
/ 17 февраля 2012

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

2 голосов
/ 17 февраля 2012

Вы можете быть локально склонны к ARP Spoofing . Когда вредоносный компьютер убеждает маршрутизатор связать IP-адрес с его MAC-адресом.

Уровень и механизм доверия действительно зависят от чувствительности сервера / службы, которую вы пытаетесь защитить, и среды, в которой вы работаете.

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

1 голос
/ 23 февраля 2012

Меня беспокоит, возможно ли точно определить IP-адрес клиента в сервлете Java?

Нет, это невозможно. Существует ряд сценариев, в которых вы не увидите реальный IP-адрес клиента из-за действий пользователя или по другим причинам, не зависящим от пользователя.

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

Если вам действительно необходимо ограничить доступ к определенному набору компьютеров, вам следует рассмотреть возможность использования чего-то вроде SSL / TLS с сертификатами клиента в качестве первой линии защиты. TLS с клиентскими сертификатами описан здесь .

0 голосов
/ 17 февраля 2012

IP-адреса могут быть легко подделаны как отправители электронной почты, я настоятельно рекомендую не полагаться на них исключительно.

...