我正在构建一个servlet,以执行只能从主机本身启动的工作。我的当前计划是检查服务方法中的请求对象:
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException我在ServletRequest上看到的唯一似乎相关的方法是getRemoteHost()和getRemoteAddr()。我最关心的问题是这是否可能被欺骗(有人可以用源IP 127.0.0.1发送入站请求并启动进程),或者如果使用127.0.0.1检查IP是否会失败。
将有一个证书,应该防止一个IP欺骗是成功的,但我不禁觉得,有一个更好的,更直接的方式来检查(或以其他方式限制)的来源的请求。
是否有一种标准方法可以可靠地使此限制独立于IP版本,并且不受欺骗(假设攻击者可以获得证书,但不能访问服务器)?我认为从安全的角度来看,证书应该是足够的;我最感兴趣的是解决这个问题的‘正确’方法是什么。
编辑:
我不相信这是java- using a filter to check remote address的重复,因为我一开始就没有考虑使用过滤器。虽然基于过滤器的解决方案最终是我所做的,但这个问题对其他潜在的解决方案也是开放的(例如,Raffaele关于使用服务器套接字的建议可能对其他人有用,或者一个尚未发布的答案可能优于这两种方法)。
发布于 2015-08-27 17:01:18
您可以使用Filters
class OnlyLocalhostFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
if (servletRequest.getLocalAddr().equals(servletRequest.getRemoteAddr())) {
filterChain.doFilter(servletRequest, servletResponse);
}
}
@Override
public void destroy() {
}
}声明之后,在web.xml中过滤web.xml并将其绑定到所需的servlet。
更新:
这个解决方案并不总是正确的。找到答案here
发布于 2015-08-27 16:43:13
解决这一问题的标准方法不是在servlet (应用程序)级别,而是将整个服务器套接字绑定到127.0.0.1 (或另一个回送地址)上。
我认为Java的默认anyaddress套接字使用0.0.0.0 (任意地址),但是如果您指定一个环回地址(如127.0.0.1 (或localhost) ),则您的应用程序在内核级别上受到保护。
https://stackoverflow.com/questions/32255073
复制相似问题