2012-02-17 3 views
5

인증없이 특정 컴퓨터의 모든 호출을 수락하도록 네트워크의 컴퓨터를 구성하고 싶습니다. 이를 위해 검사되지 않은 인증을 허용하는 데 필요한 신뢰 요소로 클라이언트 시스템의 IP 주소를 사용할 계획입니다.정확하게 java 서블릿에서 클라이언트의 IP 주소를 확인할 수 있습니까

자바 서블릿에서 클라이언트의 IP 주소를 정확하게 판별하는 것이 가능합니까? 서블릿에있는 IP를 해킹 메커니즘으로 변경하여 내 서버가 신뢰할 수있는 IP라고 믿게 할 수 있습니까?

예를 들어 내 서버 시스템이 192.168.0.1을 신뢰하도록 구성된 경우 192.168.0.1 이외의 다른 클라이언트가 192.168.0.1으로 가장하여 내 인증 메커니즘을 속일 수 있습니까?

답변

14

HttpServletRequest 클래스의 getRemoteAddr() 메서드를 사용하여 IP 주소를 얻을 수 있습니다. 그래도 조심해. 클라이언트가 프록시 서버 (또는 NAT 방화벽)의 뒤에 있으면 프록시 IP 주소를 대신 받게됩니다.

따라서 X-Forwarded-For HTTP 헤더 (HTTP 프록시 뒤에있는 클라이언트의 원본 IP 주소를 식별하기위한 표준)를 찾을 수도 있습니다. Wikipedia에 대한 자세한 내용보기 그래도 조심해. 클라이언트가 프록시 뒤에 있지 않으면 null XFF 헤더를 얻을 수 있습니다. 따라서이 경로를 따르려면 서블릿 메서드와 XFF 헤더 평가를 혼합하여 사용해야합니다. 그러나 프록시가 귀하에게 헤더를 전달한다는 보장은 없습니다.

그러나 원본 IP 주소는 악의적 인 클라이언트가 쉽게 변경하거나 위장 할 수 있다는 점에 유의하십시오. 일종의 클라이언트 인증 (예 : 인증서)을 사용하는 것이 좋습니다. 웹 애플 리케이션을위한 방법은 없습니다 정확하게 클라이언트의 IP 주소를 결정합니다.

+0

및 +1은 XFF 헤더를 언급하고 null 가능성을 나타냅니다. – stevevls

+0

클라이언트 인증은 어떻게 작동합니까? 클라이언트가 https 통신에서 보내는 것과 비슷한 인증서를 클라이언트가 보낼 수 있는지 확인하십시오. 자세한 내용을 제공해주십시오. – Ashish

+1

자체 서명 된 클라이언트 인증서를 생성하여 클라이언트 시스템의 키 저장소에 설치할 수 있습니다 (클라이언트에서 Java를 사용하고 있습니까?). 그런 다음 서버는 주어진 CA (이 경우 사용자)의 클라이언트 인증서로 서명 된 요청 만 수락해야합니다. 웹상에 Java + 클라이언트 인증서에 관한 많은 문서가 있습니다. 또한 기본 사항에 대해 TLS에서 탁월한 [Wikipedia 항목] (http://en.wikipedia.org/wiki/Transport_Layer_Security)을 살펴보십시오. – Viccari

0

이메일 발신자처럼 IP를 쉽게 위조 할 수 있습니다. 전적으로 IP에만 의존하지 말 것을 강력히 권합니다.

+0

지정된 IP 주소로 회신 할 때 메일 발신자만큼 쉽지 않습니다. 그래서 실제 문제는 행동의 경우 원본 IP를 tzrusting하는 것이지만 정보를 제공 할 때 소스 IP에 의존 할 수 있습니다. – Hurda

+1

그래, 나는 stevelvs가 쓰기와 읽기 전용을 구별하기 때문에 대답을 upvoted. Btw. 두 경우 모두에서 응답을받을 수 없기 때문에 메일 발신자는 동일합니다. – wintersolutions

7

IP Spoofing에 취약 할 수 있습니다. 다른 IP 주소의 패킷을 쉽게 위조 할 수 있습니다. 그러나 스푸핑에 대한 문제는 공격자가 응답 패킷을받을 수 없다는 것입니다. 따라서 서비스를 호출해도 내부적 인 상태 변경 (즉, 읽기 전용)이 발생하지 않는다면 문제가되지 않습니다. 그러나 서비스에 대한 호출이 이라고 쓰면이라고 쓰면 스푸핑 된 패킷으로 인해 시스템의 내부 상태가 변경 될 수 있으므로 IP 주소에만 의존해서는 안됩니다.

+0

+1은 읽기 대 쓰기 효과를 가져옵니다. – Viccari

+0

원하는 기능을 구현하는 방법, 즉 내 네트워크의 컴퓨터를 신뢰하는 방법을 제공해 주시기 바랍니다. – Ashish

+0

당신이 할 수있는 일의 일부는 잠글 수있는 사이클의 수와 균형을 이루는 허용 가능한 위험 수준을 결정하는 것입니다. 당신이 은행이라면, 당신은 그것이 견고하다는 것을 확실히 할 필요가 있습니다, 그러나 다른 응용 프로그램은 더 관용을 가지고 있습니다. 하나의 옵션은 공개 IP에 구속되지 않고 시스템 관리자가 로컬 네트워크를 잠그도록 신뢰하는 것입니다. 정말로 보안을 유지해야하는 경우 viccaris는 클라이언트 인증서를 사용하는 것이 좋습니다. 무엇을 하든지 IP 확인을 넘어서는 경우 쉽게 액세스를 취소 할 수 있는지 확인하십시오. – stevevls

2

ARP Spoofing에 국부적으로 감염 될 수 있습니다. 악성 머신이 라우터가 IP 주소를 MAC 주소와 연결하도록 유도합니다.

수준과 신뢰의 메커니즘은 정말 당신이 보호하려고하는 서버/서비스와 당신이 운영 환경의 감도에 따라 달라집니다.

그것은이 민간 주어진 로컬 배열이 나에게 보인다 IP 주소 192.168 범위. 이 서버가 공개 된 상태가 아니고 비판적이지 않은 경우 공개 및 기타 개인 LAN에서 잘 차단 된 비교적 안전한 LAN 환경에서 작업하고 있다면 괜찮습니다. 그렇지 않으면 더 높은 수준의 다른 보안 옵션을 고려해야합니다.

+0

멋진 포인트. 나는 (아직) 로컬 네트워크에서 악의적 인 사용자에 대해 걱정하는 데 많은 시간을 할애하지는 못했지만 확실히 발생하는 것으로 알려져 있으며이를 방지하는 것이 좋습니다. :) – stevevls

+0

192.168의 IP 범위는 공용 라우터에 의해 운반되지 않습니다. 따라서 어떤 위협도 내부적으로 발생해야합니다. –

1

자바 서블릿에서 클라이언트의 IP 주소를 정확하게 결정할 수 있습니까?

아니요. 사용자의 작업 또는 사용자가 제어 할 수없는 기타 이유로 인해 실제 클라이언트 IP 주소가 표시되지 않는 여러 가지 시나리오가 있습니다.

후자의 경우 IP 기반 식별은 정직한 고객을 위해 머리를 아프게합니다. 즉 고객이 정말로 갖고 싶어하는 고객입니다.

특정 컴퓨터 집합에 대한 액세스를 정말로 제한해야하는 경우 클라이언트 인증서가있는 SSL/TLS와 같은 것을 사용하는 것이 좋습니다. 클라이언트 인증서가있는 TLS는 here으로 설명됩니다.

관련 문제