Можно ли точно определить IP-адрес клиента в Java-сервлет

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

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

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

5 ответов


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

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

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


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


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

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

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


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

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

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

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


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