2015-06-30 3 views
1

Я пытаюсь найти IP-адрес клиента. И мне сказали, что «request.getHeader (« HTTP_X_FORWARDED_FOR ») не может быть доверен, так как он может быть подделан, и вместо этого я должен использовать request.getRemoteAddr. (В моем случае это нормально, чтобы получить IP-адрес прокси) Так что мой вопрос: :Почему ServletRequest.getRemoteAddr нельзя подделать?

Почему ServletRequest.getRemoteAddr нельзя подделать?

Другой вопрос: В чем разница между HTTP_X_FORWARDED_FOR и X_FORWARDED_FOR?

+1

Это * можно * подделать, но это намного сложнее. Он поступает из IP-пакета, а не из HTTP-заголовка. – EJP

+0

Спасибо! Если я правильно понимаю: HTTP-заголовок находится в «прикладном уровне» модели OSI, поэтому он легко подделывается через программу (один из них java), но если я хочу изменить возвращаемое значение ServletRequest.getRemoteAddr, мне нужно проанализировать ip пакет, который намного сложнее. – bylijinnan

ответ

1

Если вы request.getRemoteAddr();

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

Так что если

В моем случае это нормально, чтобы просто получить IP прокси-службы

вы с этим согласны, то request.getRemoteAddr(); достаточно.

Но в идеальном случае вы должны попробовать это

//is client behind something? 
    String ipAddress = request.getHeader("X-FORWARDED-FOR"); 
    if (ipAddress == null) { 
     ipAddress = request.getRemoteAddr(); 
    } 

X_FORWARDED_FOR

X-Forwarded For-(XFF) HTTP поля заголовка является стандартом де-факто для идентификации происходящий IP адрес клиента, подключающегося к веб-серверу через прокси-сервер HTTP или балансировщик нагрузки.

HTTP_X_FORWARDED_FOR

HTTP_X_FORWARDED_FOR заголовка устанавливается прокси-серверами для определения IP-адрес хоста, который делает запрос HTTP через прокси-сервер.

Короче говоря, это все тот же заголовок, который по-разному упоминается различными вариантами. Для более детального просмотра: HTTP Headers: What is the difference between X-FORWARDED-FOR, X_FORWARDED_FOR and HTTP_X_FORWARDED_FOR?

+0

Спасибо! В java, request.getHeader («X-FORWARDED-FOR») и request.getHeader («X_FORWARDED_FOR») и request.getHeader («HTTP_X_FORWARDED_FOR») возвращают одно и то же значение? – bylijinnan