首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >限制仅从本地主机调用J2EE servlet的正确方法是什么?

限制仅从本地主机调用J2EE servlet的正确方法是什么?
EN

Stack Overflow用户
提问于 2015-08-27 16:40:05
回答 2查看 1.7K关注 0票数 4

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

代码语言:javascript
复制
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关于使用服务器套接字的建议可能对其他人有用,或者一个尚未发布的答案可能优于这两种方法)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-27 17:01:18

您可以使用Filters

代码语言:javascript
复制
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

票数 2
EN

Stack Overflow用户

发布于 2015-08-27 16:43:13

解决这一问题的标准方法不是在servlet (应用程序)级别,而是将整个服务器套接字绑定到127.0.0.1 (或另一个回送地址)上。

我认为Java的默认anyaddress套接字使用0.0.0.0 (任意地址),但是如果您指定一个环回地址(如127.0.0.1 (或localhost) ),则您的应用程序在内核级别上受到保护。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32255073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档