在Web开发中,HTTP伪请求(又称请求头伪造攻击)是初学者极易忽视的安全隐患,尤其对于基于Tomcat部署的Java、JSP服务,因默认配置无严格的请求头校验,很容易被攻击者利用,实现绕过域名限制、访问内网服务、执行未授权操作等恶意行为。本文将拆解HTTP伪请求的攻击逻辑,聚焦Tomcat/Java(JSP)服务的防护要点,为初学者提供可落地的安全方案。

一、HTTP伪请求的核心本质与攻击逻辑

1. 什么是HTTP伪请求

HTTP伪请求,本质是攻击者通过篡改HTTP请求的核心头字段(以Host、X-Forwarded-Host、Referer为主),伪造请求的目标域名、来源地址或客户端身份,绕过服务器的访问控制策略,欺骗服务端执行非法请求的攻击手段。

其中,Host头伪造是最典型、危害最大的类型——Tomcat等Web容器默认通过Host头识别请求的目标域名,若未做校验,攻击者只需篡改Host头,就能通过“IP+端口”直接访问本应仅允许特定域名访问的服务,甚至突破内网边界,访问敏感的JSP后台页面或Java接口。

2. 针对Tomcat/Java(JSP)服务的完整攻击逻辑

以Tomcat部署的JSP服务为例,HTTP伪请求的攻击链路清晰,共分为4步,初学者可直观理解:

(1)攻击者构造核心攻击参数

攻击者无需复杂技术,只需明确3个关键信息,即可构造伪请求:

  • 目标端点:Tomcat服务的IP+端口(如内网服务器IP:192.168.1.10:8080,这是服务的真实访问地址);

  • 伪造Host:服务端信任的合法域名(如www.legaldomain.com,该域名已绑定服务,是服务对外提供访问的合法入口);

  • 合法请求内容:符合JSP页面或Java接口的请求格式(如JSP表单参数、JSON数据),避免因格式错误被服务端拦截。

(2)发起伪造请求(绕过前端限制)

很多初学者会误以为“浏览器禁止修改Host头,就不会有伪请求风险”,但实际情况是:浏览器仅禁止前端JS修改Host头(会抛出“Refused to set unsafe header 'Host'”错误),但攻击者可通过非浏览器工具(如curl、Postman、Python脚本)直接构造请求,完全绕过前端限制。

示例(curl模拟攻击JSP服务):


# 伪造Host头,访问Tomcat上的敏感JSP页面 curl -X POST \ http://192.168.1.10:8080/admin/manager.jsp \ -H "Host: www.legaldomain.com" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "username=test&password=123456"

(3)无防护Tomcat/JSP服务的处理流程

Tomcat默认配置下,对Host头无任何校验,会按以下逻辑处理伪请求:

  1. Tomcat通过8080端口接收请求,解析HTTP头中的Host字段为“www.legaldomain.com”;

  2. 因未校验Host合法性,Tomcat认为请求来自合法域名,将请求转发到对应的JSP页面(如manager.jsp)或Java Servlet;

  3. JSP页面/Java接口执行业务逻辑(如用户登录、数据查询),并返回响应数据;

  4. 攻击者成功绕过域名限制,通过IP+伪造Host,访问到本应仅允许合法域名访问的敏感服务。

(4)攻击成功的核心前提

对Tomcat/Java(JSP)服务而言,伪请求攻击能成功,核心是存在两个漏洞,也是初学者最易忽略的点:

  • 服务未配置Host白名单,允许任意Host值的请求访问;

  • Tomcat默认监听“0.0.0.0:8080”(所有网卡可访问),内网端口直接暴露到外网,攻击者可通过IP直接访问;

  • JSP页面/Java接口未做二次身份校验,仅依赖“域名访问”作为防护手段。

二、初学者必学:Tomcat/Java(JSP)服务伪请求防护方案

防护的核心原则是:永远不要信任客户端传递的任何HTTP头字段,必须在服务端(Tomcat容器+Java代码+JSP页面)做多层校验。以下方案从易到难,适合初学者落地,无需复杂的安全知识。

1. 核心防护:Tomcat容器层配置Host白名单(最优先、最有效)

Tomcat作为Java/JSP服务的运行容器,从容器层限制Host访问,能直接拦截所有非法伪请求,无需修改业务代码,是初学者的首选方案。核心是修改Tomcat的核心配置文件server.xml

操作步骤(以Tomcat 8/9/10为例)

  1. 找到Tomcat安装目录下的conf/server.xml文件;

  2. 修改<Connector>标签,添加allowedHosts属性,指定合法Host白名单;

  3. 配置<Host>标签,拒绝非法Host的默认映射;

  4. 重启Tomcat,配置生效。

配置示例:


&lt;Service name="Catalina"&gt; <!-- 核心配置:添加allowedHosts,限制仅允许的Host --> <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" allowedHosts="www.legaldomain.com,127.0.0.1,localhost"/> <Engine name="Catalina" defaultHost="www.legaldomain.com"&gt; <!-- 合法Host对应的应用部署 --> <Host name="www.legaldomain.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="/" docBase="your-jsp-app" reloadable="false"/&gt; <!-- 开启访问日志,便于审计伪请求 --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b "%{Host}i""/> </Host&gt; <!-- 拒绝所有非法Host的请求 --> <Host name="localhost" appBase="webapps" autoDeploy="true"> <Valve className="org.apache.catalina.valves.RejectValve" /> </Host> </Engine> </Service>

说明:allowedHosts中填写合法的域名、本地IP(127.0.0.1)、localhost,多个值用逗号分隔;非法Host的请求会被Tomcat直接拦截,返回403 Forbidden。

2. 应急防护:Java Filter全局拦截(无法修改Tomcat配置时)

若初学者无Tomcat容器的修改权限(如租用虚拟主机、部署在第三方平台),可通过编写Java Filter(过滤器),在应用层拦截所有请求,校验Host头,适配所有Java/JSP项目。

实现步骤

  1. 创建Filter类(放在WEB-INF/classes/com/filter目录下);

  2. 在Filter中定义Host白名单,校验所有请求的Host头;

  3. WEB-INF/web.xml中注册Filter,让其拦截所有请求。

Filter代码示例(HostCheckFilter.java):


package com.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.HashSet; import java.util.Set; // 拦截所有请求(包括JSP页面、Servlet、接口) @WebFilter(urlPatterns = "/*") public class HostCheckFilter implements Filter { // 合法Host白名单(按需修改) private static final Set<String> ALLOWED_HOSTS = new HashSet<>(); static { ALLOWED_HOSTS.add("www.legaldomain.com"); // 合法域名 ALLOWED_HOSTS.add("127.0.0.1:8080"); // 本地测试(带端口) ALLOWED_HOSTS.add("localhost:8080"); // 本地测试(带端口) } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; // 获取请求的Host头 String host = req.getHeader("Host"); // 校验Host:空值或不在白名单,直接拒绝 if (host == null || !ALLOWED_HOSTS.contains(host)) { resp.setStatus(HttpServletResponse.SC_FORBIDDEN); resp.setContentType("text/html;charset=UTF-8"); resp.getWriter().write("<h1>403 Forbidden</h1><p>非法请求:Host头不被允许</p>"); return; } // 校验通过,继续处理请求(转发到JSP/Servlet) chain.doFilter(request, response); } }

Web.xml注册Filter(若未使用@WebFilter注解):


<filter> <filter-name>HostCheckFilter</filter-name> <filter-class>com.filter.HostCheckFilter</filter-class> </filter> <filter-mapping> <filter-name>HostCheckFilter</filter-name> <url-pattern>/*</url-pattern> <!-- 拦截所有请求 --> </filter-mapping>

3. 兜底防护:JSP页面直接校验(核心页面应急)

若初学者既无法修改Tomcat配置,也无法部署Filter(如简单的静态JSP项目),可在核心敏感JSP页面(如后台登录页、数据查询页)的头部,直接添加Host校验代码,实现兜底防护。

JSP页面校验示例(manager.jsp):


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% // 1. 获取请求的Host头 String host = request.getHeader("Host"); // 2. 定义合法Host白名单 Set<String> allowedHosts = new HashSet<>(); allowedHosts.add("www.legaldomain.com"); allowedHosts.add("127.0.0.1:8080"); // 3. 校验Host,非法则拒绝访问 if (host == null || !allowedHosts.contains(host)) { response.setStatus(403); out.write("<h1>403 Forbidden</h1><p>非法请求,禁止访问</p>"); return; // 终止页面执行 } %> <!-- 以下是原有JSP页面内容(如登录表单、业务逻辑) --> <html> <head><title>后台管理页面</title></head> <body> <form action="login" method="post"> 用户名:<input type="text" name="username"><br> 密码:<input type="password" name="password"><br> <input type="submit" value="登录"> </form> </body> </html>

4. 进阶防护:限制访问范围+反向代理加固

除了上述核心防护,初学者还可通过以下两个操作,进一步降低伪请求风险,形成“多层防护”。

(1)限制Tomcat监听地址

Tomcat默认监听“0.0.0.0:8080”(所有网卡可访问),若服务仅需内网访问,可修改server.xml<Connector>address属性,仅绑定内网IP,禁止外网直接访问:


<Connector port="8080" address="192.168.1.10" <!-- 仅绑定内网IP --> protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" allowedHosts="www.legaldomain.com,127.0.0.1,localhost"/>

(2)Nginx反向代理前置拦截

若服务需要对外提供访问,建议通过Nginx反向代理Tomcat服务,在代理层再次校验Host,形成“代理层+容器层+应用层”的三重防护:


server { listen 80; server_name www.legaldomain.com; # 仅允许该域名访问 # 拦截非法Host请求(第一层防护) if ($host != 'www.legaldomain.com') { return 403; } # 反向代理到Tomcat服务 location / { proxy_pass http://192.168.1.10:8080; proxy_set_header Host $host; # 传递合法Host给Tomcat proxy_set_header X-Real-IP $remote_addr; # 传递真实客户端IP } }

三、初学者常见误区与避坑指南

1. 常见认知误区

  • 误区1:“浏览器禁止修改Host头,就不会有伪请求风险”—— 错误!攻击者可通过curl、Postman等工具直接构造请求,绕过前端限制;

  • 误区2:“服务绑定域名后,只能通过域名访问”—— 错误!若未校验Host,直接访问“IP+端口+伪造Host”即可突破限制;

  • 误区3:“仅靠密码验证就能防伪请求”—— 错误!伪请求的核心是绕过域名限制,若服务暴露在外网,攻击者可先通过伪请求访问到登录页面,再尝试暴力破解;

  • 误区4:“Tomcat低版本无需防护”—— 错误!Tomcat所有版本默认都不校验Host头,低版本(如Tomcat 7)更易被攻击,且无安全更新。

2. 避坑关键要点

  • Tomcat的allowedHosts属性需手动配置,默认无限制,初学者部署服务后,第一时间配置;

  • Filter需注册在所有业务Filter之前,避免部分请求(如静态资源)绕过校验;

  • JSP页面的校验代码需放在页面最顶部,避免页面加载过程中泄露敏感信息;

  • 测试环境的“0.0.0.0:8080”监听配置,上线前必须改为内网IP或限制访问;

  • 定期查看Tomcat访问日志(access_log),排查是否有非法Host的请求尝试。

四、总结

HTTP伪请求对Tomcat/Java(JSP)服务的威胁,核心源于“服务端未校验Host头”和“服务过度暴露”。对初学者而言,无需掌握复杂的安全技术,只需落地以下3个核心操作,就能快速抵御90%以上的伪请求攻击:

  1. 优先配置Tomcat容器层的Host白名单(修改server.xml),从源头拦截非法请求;

  2. 无法修改容器配置时,部署Java Filter实现全局Host校验;

  3. 限制Tomcat监听地址,避免内网端口直接暴露到外网。

安全防护的核心是“最小暴露+多层校验”,初学者在开发和部署Tomcat/Java(JSP)服务时,务必养成“不信任客户端请求头”的习惯,从容器、代码、页面三个层面筑牢防护防线,避免因忽视伪请求风险,导致服务被非法访问。

东方仙盟:拥抱知识开源,共筑数字新生态


在全球化与数字化浪潮中,东方仙盟始终秉持开放协作、知识共享的理念,积极拥抱开源技术与开放标准。我们相信,唯有打破技术壁垒、汇聚全球智慧,才能真正推动行业的可持续发展。

开源赋能中小商户:通过将前端异常检测、跨系统数据互联等核心能力开源化,东方仙盟为全球中小商户提供了低成本、高可靠的技术解决方案,让更多商家能够平等享受数字转型的红利。
共建行业标准:我们积极参与国际技术社区,与全球开发者、合作伙伴共同制定开放协议与技术规范,推动跨境零售、文旅、餐饮等多业态的系统互联互通,构建更加公平、高效的数字生态。
知识普惠,共促发展:通过开源社区、技术文档与培训体系,东方仙盟致力于将前沿技术转化为可落地的行业实践,赋能全球合作伙伴,共同培育创新人才,推动数字经济 的普惠式增长


阿雪技术观

在科技发展浪潮中,我们不妨积极投身技术共享。不满足于做受益者,更要主动担当贡献者。无论是分享代码、撰写技术博客,还是参与开源项目维护改进,每一个微小举动都可能蕴含推动技术进步的巨大能量。东方仙盟是汇聚力量的天地,我们携手在此探索硅基 生命,为科技进步添砖加瓦。

Hey folks, in this wild tech - driven world, why not dive headfirst into the whole tech - sharing scene? Don't just be the one reaping all the benefits; step up and be a contributor too. Whether you're tossing out your code snippets , hammering out some tech blogs, or getting your hands dirty with maintaining and sprucing up open - source projects, every little thing you do might just end up being a massive force that pushes tech forward. And guess what? The Eastern FairyAlliance is this awesome  place where we all come together. We're gonna team up and explore the whole silicon - based life thing, and in the process, we'll be fueling the growth of technology 

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐