java - использование фильтра для проверки удаленного адреса - PullRequest
6 голосов
/ 15 февраля 2011

Каков наилучший подход для обнаружения локального доступа к веб-приложению?
Мне интересно проверить это в фильтре (javax.servlet.Filter).
Я мог бы проверитьServletRequest#getRemoteAddr() если это 127.0.0.1, но если он работает на машине IPv6, адрес будет 0:0:0:0:0:0:0:1.
Есть ли какие-либо другие подводные камни, о которых я должен знать, или если я просто проверю эти 2 строкишаблоны, я был бы в порядке?

Спасибо

Ответы [ 3 ]

11 голосов
/ 16 февраля 2011

Теоретически, следующего должно быть достаточно.

if (request.getRemoteAddr().equals(request.getLocalAddr())) {
    // Locally accessed.
} else {
    // Remotely accessed.
}


Обновление согласно комментариям, request.getLocalAddr(), кажется, возвращает 0.0.0.0, что действительно может произойти, когда сервер находится за прокси-сервером.

Вместо этого вы можете захотеть сравнить его с адресами, указанными в InetAddress.

private Set<String> localAddresses = new HashSet<String>(); 

@Override
public void init(FilterConfig config) throws ServletException {
    try {
        localAddresses.add(InetAddress.getLocalHost().getHostAddress());
        for (InetAddress inetAddress : InetAddress.getAllByName("localhost")) {
            localAddresses.add(inetAddress.getHostAddress());
        }
    } catch (IOException e) {
        throw new ServletException("Unable to lookup local addresses");
    }
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
    if (localAddresses.contains(request.getRemoteAddr())) {
        // Locally accessed.
    } else {
        // Remotely accessed.
    }
}

В моем случае localAddresses содержит следующее:

[192.168.1.101, 0:0:0:0:0:0:0:1, 127.0.0.1]
1 голос
/ 16 февраля 2011

Даже если клиент работает локально, он может не использовать интерфейс обратной связи. Скорее всего, у вашей машины будет назначенный IP-адрес, и в зависимости от конфигурации / etc / hosts, конфигурации DNS и т. Д. IP-адрес, к которому вы подключаетесь, может не являться адресом обратной связи.

Предполагая, что вы хотите предоставить какой-то "улучшенный" интерфейс, который является "более безопасным", поскольку он создается на той же машине, помните, что даже петлевые интерфейсы могут быть обнаружены с помощью таких инструментов, как wireshark. Если этот интерфейс предназначен для отображения данных, подходящих для более доверенного клиента, то шансы хорошие, вы должны предпринять усилия для правильного туннелирования ssl через https.

1 голос
/ 16 февраля 2011

Вам также необходимо проверить все другие IP-адреса вашего ящика, например, один из ваших интерфейсов Ethernet.Также рассмотрим псевдонимы.

...