限制J2EE servlet只能从localhost调用的正确方法是什么?

时间:2015-08-27 16:40:06

标签: java java-ee servlets localhost

我正在构建一个servlet来执行只能从主机本身启动的工作。我目前的计划是检查服务方法中的请求对象:

public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException

我在ServletRequest上看到的唯一相似的方法是getRemoteHost()getRemoteAddr()。我最担心的是这是否可能被欺骗(有人可以使用源IP 127.0.0.1发送入站请求并启动进程),或者如果使用IPv6,则检查IP 127.0.0.1可能会失败。< / p>

将会有一个凭据可以防止IP欺骗成功但我无法帮助但感觉更好,更直接的方式来检查(或以其他方式限制)请求的来源

是否有一种标准方法可靠地实现此限制,该限制独立于IP版本并且不受欺骗(假设攻击者可以获取凭据但无法访问服务器)?我认为从安全角度来看,凭证应该足够了;我最感兴趣的是&#39;对&#39;解决这个问题的方法是。

修改

我不相信这是java- using a filter to check remote address的副本,因为我没有考虑首先使用过滤器。虽然我最终采用基于过滤器的解决方案,但这个问题对其他可能的解决方案也是开放的(例如,Raffaele建议使用服务器套接字可能对其他人有用或者答案没有&#39已发布但可能优于两种方法。)

1 个答案:

答案 0 :(得分:2)

您可以使用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() {

    }
}

之后声明你在OnlyLocalhostFilter中过滤web.xml并将其绑定到你想要的servlet。

<强>更新

此解决方案并不总是正常。找到答案here