我正在构建一个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已发布但可能优于两种方法。)
答案 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