【Java核心高阶进阶】17-JDK命令行诊断工具实战
2026/8/9 23:11:36
// 允许任意域名访问(生产环境应限制具体域名) header("Access-Control-Allow-Origin: https://trusted-frontend.com"); // 允许的请求方法 header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS"); // 允许携带的请求头 header("Access-Control-Allow-Headers: Content-Type, Authorization"); // 预检请求的有效期(秒) header("Access-Control-Max-Age: 3600"); // 处理预检请求 if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit; }*设置Access-Control-Allow-Origin,应指定可信源Origin请求头,防止反射攻击| 响应头 | 作用 |
|---|---|
| Access-Control-Allow-Origin | 定义允许访问资源的外域 |
| Access-Control-Allow-Credentials | 是否允许携带凭据(如Cookie) |
| Access-Control-Expose-Headers | 指定客户端可访问的响应头 |
Access-Control-Allow-Origin指定可接受的来源。OPTIONS /data HTTP/1.1 Host: api.example.com Origin: https://site-a.com Access-Control-Request-Method: PUT Access-Control-Request-Headers: X-Custom-Header该请求用于确认服务器是否允许实际请求的方法和头部。服务器需返回对应许可头,例如:Access-Control-Allow-Origin: https://site-a.com Access-Control-Allow-Methods: PUT Access-Control-Allow-Headers: X-Custom-Header只有预检通过后,浏览器才会发出原始请求。// 允许的源 header('Access-Control-Allow-Origin: https://example.com'); // 允许的请求方法 header('Access-Control-Allow-Methods: GET, POST, OPTIONS'); // 允许携带的头部字段 header('Access-Control-Allow-Headers: Content-Type, Authorization'); // 是否允许携带凭证(如Cookie) header('Access-Control-Allow-Credentials: true');上述代码中,Access-Control-Allow-Origin指定具体域名可增强安全性,避免使用通配符*。当请求包含凭证时,必须明确指定源且Allow-Credentials设为 true。app.use(cors({ origin: 'https://trusted-site.com', credentials: true }));上述代码配置仅允许受信任的源携带凭据访问。需配合 SameSite Cookie 属性:Set-Cookie: auth_token=abc123; Secure; HttpOnly; SameSite=Strict其中 `Secure` 确保仅 HTTPS 传输,`HttpOnly` 防止脚本访问,`SameSite=Strict` 有效缓解 CSRF。const allowedOrigins = ['https://trusted.example.com', 'https://admin.example.org']; app.use((req, res, next) => { const requestOrigin = req.headers.origin; if (allowedOrigins.includes(requestOrigin)) { res.setHeader('Access-Control-Allow-Origin', requestOrigin); res.setHeader('Vary', 'Origin'); // 确保缓存按Origin区分 } res.setHeader('Access-Control-Allow-Credentials', 'true'); next(); });上述代码中,`Vary: Origin` 告知代理服务器需根据Origin字段缓存不同响应,避免缓存投毒;而显式白名单匹配可阻断非法来源的反射尝试。Access-Control-Max-Age响应头,可缓存预检结果,避免重复请求。例如:OPTIONS /api/data HTTP/1.1 Access-Control-Allow-Methods: GET, POST Access-Control-Allow-Headers: Content-Type, Authorization Access-Control-Max-Age: 86400上述配置将预检结果缓存一天(86400秒),在此期间相同资源的跨域请求无需再次预检。POST /api/transfer HTTP/1.1 Host: bank.example.com Origin: https://trusted-site.com Cookie: session=abc123 Content-Type: application/json {"to": "attacker", "amount": 1000}上述请求中,攻击者伪造 Origin 为可信站点,若服务端未验证其真实性,将误判为合法跨域请求。