具体问题描述:
绿盟检测出“检测到目标URL存在http host头攻击漏洞”,检测报告中有解决办法(在Apache和Nginx里可以通过设置一个虚拟机来记录所有的非法host header。在Nginx里还可以通过指定一个SERVER_NAME名单,Apache也可以通过指定一个SERVER_NAME名单并开启UseCanonicalName选项。)
如果应用程序没有对host header值进行处理,就有可能造成恶意代码的传入。
解决办法
方法一:如果是自己引入的外部tomcat,修改tomcat配置文件server.xml添加访问IP白名单即可
方法二:如果是内嵌的tomcat,比如springboot项目,可以选择如下方法
添加过滤器:
package cn.util.filter;
import cn.waner.was.util.RegularUtil;
import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
*
* 设置ip访问白名单,防止被头部攻击
*
* @author Author
* create date 2020/5/21
*/
@SuppressWarnings("serial")
@WebFilter("/*") //声明这个类是过滤器
public class HttpHostFilter extends HttpServlet implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
StringBuffer url = request.getRequestURL();
String s = request.getRequestURL().toString();
// 头攻击检测 过滤主机名
String requestHost = request.getHeader("host");
if (requestHost != null && !checkBlankList(requestHost)) {
response.setStatus(403);
return;
}
filterChain.doFilter(request, response);
}
//判断主机是否存在白名单中
private boolean checkBlankList(String host){
/*
//这一段是用来检测是否有端口,如有去掉端口(根据自己需求看是否要加上)
if (host.contains(":")){
host = host.substring(0,host.indexOf(":"));
}
*/
//这里host有时候会包括项目端口号,下面白名单IP可以写成一个集合,看集合是否包含当前访问IP
if (host.contains("192.168.1.12")){
return true;
}
return false;
}
}
,过滤器配置,最后在Application启动类中加上如下注解
@ServletComponentScan(basePackages = "cn.util.filter") //声明扫描包路径
版权声明:本文为weixin_44806193原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。