Tomcat如何防止X-Forwarded-For

整改建议:

1、 配置Tomcat过滤器中的remoteIPHeader选项为“X-Forwarded-For”,让Tomcat从正确的请求头中取值;

2、 添加header拦截器,在请求到达Tomcat之前,如果发现请求头中存在X-Forwarded-For,就把它删掉;

3、 设置合理的Tomcat访问权限,只允许可信任IP地址对Tomcat服务器发起请求;

4、 在nginx服务器端配置proxy_set_header,将X-Forwarded-For设置为空;

5、 在web应用中实现过滤,编写filter,使用request.getHeader(“X-Forwarded-For”),如果取到值,则进行检查,如果不是可信任IP地址,则将取到的值删除。

代码表示:在web应用中实现过滤,编写filter,使用request.getHeader(“X-Forwarded-For”),如果取到值,则进行检查,如果不是可信任IP地址,则将取到的值删除。

方案一配置Tomcat过滤器中的remoteIPHeader选项为“X-Forwarded-For”,让Tomcat从正确的请求头中取值,如何配置示例

X-Forwarded-For可以在Tomcat的server.xml文件中的RemoteIpValve标签中配置,该标签的remoteIpHeader属性可以设置为X-Forwarded-For,表示Tomcat从X-Forwarded-For头中取值:


<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" /> 
如果你正在使用Apache作为前端网关服务器,你还需要配置正确的模式,使Apache将原始客户端IP地址添加到HTTP请求头中,否则这一配置将无效

方案二:添加header拦截器,在请求到达Tomcat之前,如果发现请求头中存在X-Forwarded-For,就把它删掉,如何实现

实现自定义的Filter,并在doFilter内实现以下逻辑:


//判断请求头中是否包含X-Forwarded-For
if (request.getHeader("X-Forwarded-For") != null) {
    //获取原有的请求头
    String value = request.getHeader("X-Forwarded-For");
    //删除X-Forwarded-For
    request.removeHeader("X-Forwarded-For");
    //重新设置请求头
    request.addHeader("X-Forwarded-For", value);
}

方案三:如何设置合理的Tomcat访问权限,只允许可信任IP地址对Tomcat服务器发起请求,从哪里配置

1、首先,打开Tomcat的conf目录下的server.xml文件,在其中添加如下配置:


<Connector port="8009" address="127.0.0.1" protocol="AJP/1.3" redirectPort="8443" 
                             connectionTimeout="20000" URIEncoding="UTF-8" 
                             acceptCount="200" maxThreads="200" 
                             allowedAddresses="IP地址" /> 

2、确保IP地址已经正确写入允许的IP地址段中,可以同时添加多个IP地址,用逗号隔开:


allowedAddresses="xxx.xxx.xx.x,xxx.xxx.xx.x,xxx.xxx.x.x" 

3、最后,重启Tomcat服务,使配置的IP地址在Tomcat上生效。

方案五:防止伪装IP,否则可以直接使用。

public class Filter implements javax.servlet.Filter{


public void destroy(){
}


public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException{
/* get x-forwarded-for from request header /
String xForwardedFor = request.getHeader("X-Forwarded-For");
/ check x-forwarded-for IP /
if (xForwardedFor != null) {
/ validate Trust IP /
if (isTrustedIP(xForwardedFor)){
/ trusted IP, do nothing /
} else {
/ untrusted IP, delete X-Forwarded-For value /
xForwardedFor = null;
}
}
/ do filter */
chain.doFilter(request,response);
}


public void init(FilterConfig config) throws ServletException{


}


private boolean isTrustedIP(String ip) {
// TODO: validate trusted IP address
return true;
}
}

我与ChatGPT对话之实际场景应用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT技术伪专家

你的认可是对我最大的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值