一、前置检查:用浏览器快速定位漏洞
修复前先确认漏洞存在,用谷歌/Edge浏览器控制台即可,无需专业扫描器(后续若需批量扫描,可用免费的OWASP ZAP)。
- 检查HTTP TRACE漏洞:按F12打开控制台→切换到Console标签→输入
fetch(window.location.href, {method: 'TRACE'})回车→若返回Response状态码为200且含TRACE开头的响应头,说明存在。
- 检查Cookie安全属性:按F12→切换到Application标签→左侧展开Cookies→点击当前域名→查看HttpOnly列(若有打勾图标则有,否则无)、Secure列(同HttpOnly规则)。
- 检查X-Frame-Options漏洞:按F12→切换到Network标签→刷新页面→随便点一个HTML资源的响应→查看Response Headers里是否有X-Frame-Options或Content-Security-Policy的frame-ancestors规则,无则存在。
二、修复方案1:关闭HTTP TRACE方法
TRACE方法是HTTP调试用的,会返回完整的请求头/正文,攻击者可能结合其他漏洞窃取Cookie或XSS payload。关闭操作根据Web服务器不同,有Nginx、Apache、Tomcat三种主流方案。
1. Nginx服务器
编辑Nginx主配置文件或站点配置文件(通常在/etc/nginx/nginx.conf或/etc/nginx/sites-available/站点域名.conf),找到http块或server块,添加以下配置后重启生效:
```nginx
全局或站点级别禁用TRACE方法
if ($request_method = TRACE) {
return 405;
}
```
验证生效:用前置检查方法测试,返回405 Method Not Allowed即可。
2. Apache服务器
编辑Apache主配置文件(通常在/etc/httpd/conf/httpd.conf或/etc/apache2/apache2.conf)或站点配置文件,找到Directory块或VirtualHost块,添加以下配置后重启生效:
```apache
全局或站点级别禁用TRACE方法
TraceEnable Off
```
验证生效:前置检查返回405或403即可。
3. Tomcat服务器
编辑Tomcat的server.xml(通常在/usr/local/tomcat/conf/server.xml或本地安装目录的conf/server.xml),找到所有带protocol="HTTP/1.1"的Connector标签,添加属性allowTrace="false"后重启生效:
```xml
```

验证生效:前置检查返回405即可。
三、修复方案2:设置Cookie的HttpOnly和Secure属性
HttpOnly属性禁止JavaScript通过document.cookie读取Cookie,防止XSS漏洞窃取;Secure属性要求Cookie仅通过HTTPS传输,防止中间人攻击。分后端代码设置和Web服务器代理设置两种方式。
1. 后端代码直接设置(优先推荐,精准可控)
- Java(Servlet API):
```java
Cookie cookie = new Cookie("user_token", "xxx");
cookie.setHttpOnly(true); // 必须设置
cookie.setSecure(true); // HTTPS环境必须设置,HTTP环境设为false
cookie.setPath("/"); // 可选,建议设为根路径避免子路径访问不到
cookie.setMaxAge(3600); // 可选,设置过期时间,0为立即删除,负数为会话Cookie
response.addCookie(cookie);
```
- Java(Spring Boot 2.x/3.x):
```yaml
application.yml
server:
servlet:
session:
cookie:
http-only: true
secure: true HTTPS环境自动生效,HTTP环境设为never
path: /
```
如果是自定义Cookie,直接用Servlet API设置或Spring的ResponseCookie:
```java
ResponseCookie cookie = ResponseCookie.from("user_token", "xxx")
.httpOnly(true)
.secure(true)
.path("/")
.maxAge(Duration.ofHours(1))
.build();
response.addHeader(HttpHeaders.SET_COOKIE, cookie.toString());
```
- Node.js(Express):
```javascript
// 先安装cookie-parser:npm install cookie-parser
const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();
app.use(cookieParser());
app.get('/', (req, res) => {
res.cookie('user_token', 'xxx', {
httpOnly: true,
secure: true, // HTTPS环境必须设置,HTTP环境设为false
path: '/',
maxAge: 3600 1000 // 毫秒为单位
});
res.send('Hello');
});
```
- PHP:
```php
// 直接设置单个Cookie
setcookie('user_token', 'xxx', [
'expires' => time() + 3600,
'path' => '/',
'domain' => '', // 可选,当前域名默认
'secure' => true, // HTTPS必须,HTTP设为false
'httponly' => true,
'samesite' => 'Strict' // 可选,额外防止CSRF,Lax也可
]);
// 全局设置所有Cookie(php.ini)
session.cookie_httponly = 1
session.cookie_secure = 1
```
2. Web服务器代理设置(后端无法修改时使用)
以Nginx为例,编辑站点配置文件,在location /块中添加以下配置,覆盖或添加所有响应的Cookie属性:
```nginx
location / {
proxy_pass http://后端服务地址:端口;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
关键:修改所有Set-Cookie响应头,添加HttpOnly和Secure
proxy_cookie_flags ~ secure httponly;
}
```
验证生效:前置检查Application标签的HttpOnly和Secure列均有打勾即可。
四、修复方案3:配置X-Frame-Options或Content-Security-Policy的frame-ancestors
X-Frame-Options防止页面被嵌入到其他域名的iframe中,避免点击劫持(Clickjacking)攻击。X-Frame-Options已被Content-Security-Policy(CSP)的frame-ancestors替代,但仍需保留兼容性配置,两种一起用。
1. 兼容性X-Frame-Options配置
三种取值:
DENY:禁止所有iframe嵌入(最安全,适合不需要跨域嵌入的页面)
SAMEORIGIN:仅允许同域名的iframe嵌入(适合需要自身子页面嵌入的场景)
ALLOW-FROM 域名:仅允许指定单个域名嵌入(兼容性差,Chrome/Firefox已废弃,建议用CSP替代)
2. 主流Web服务器+后端代码配置
- Nginx:
```nginx
add_header X-Frame-Options SAMEORIGIN always;
add_header Content-Security-Policy "frame-ancestors 'self';" always;
```
always参数确保错误页面(如404、500)也会添加响应头。
- Apache:
```apache
先加载headers模块(可能已加载)
LoadModule headers_module modules/mod_headers.so
Header always set X-Frame-Options SAMEORIGIN
Header always set Content-Security-Policy "frame-ancestors 'self';"
```
- Tomcat:
编辑
web.xml(全局配置)或项目的WEB-INF/web.xml(单个项目配置),添加过滤器:
```xml
HttpHeaderFilter
org.apache.catalina.filters.HttpHeaderSecurityFilter
antiClickJackingEnabled
true
antiClickJackingOption
SAMEORIGIN
HttpHeaderFilter
/
```
单独添加CSP的frame-ancestors可以用Tomcat的自定义过滤器或Servlet设置响应头。
- Spring Boot 2.x/3.x:
```yaml
application.yml
spring:
security:
headers:
frame-options:
same-origin: true 启用SAMEORIGIN
content-security-policy: "frame-ancestors 'self';"
```
如果项目未引入Spring Security,用拦截器设置:
```java
@Component
public class SecurityHeaderInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
response.setHeader("X-Frame-Options", "SAMEORIGIN");
response.setHeader("Content-Security-Policy", "frame-ancestors 'self';");
return true;
}
}
// 注册拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private SecurityHeaderInterceptor securityHeaderInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(securityHeaderInterceptor).addPathPatterns("/");
}
}
```
3. 验证生效
前置检查Network标签的HTML资源响应头中,同时包含X-Frame-Options: SAMEORIGIN(或DENY)和Content-Security-Policy: frame-ancestors 'self';即可。也可以创建一个测试HTML文件,用iframe嵌入当前页面,若显示空白或被浏览器拦截,说明修复成功:
```html
点击劫持测试
```