整改建议:
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对话之实际场景应用。
标签:请求,Tomcat,xxx,request,防止,IP地址,Forwarded From: https://www.cnblogs.com/zhuhuibiao/p/17124161.html