1. XSS(跨站脚本)的 Java 防御,输出编码、CSP、HttpOnly 如何落地
请说明 XSS(跨站脚本)在 Java 中的防御,包括输出编码、CSP、HttpOnly 的具体实现?
- 输出编码的 Java 实现
- CSP 响应头配置
- HttpOnly Cookie 设置
XSS 在 Java 中的防御分三层。输出编码:在渲染不可信数据时按上下文转义——用 HtmlUtils.htmlEscape(Spring)或 JSP 的 fn:escapeXml、模板引擎自动转义(Thymeleaf/FreeMarker 默认转义)对 HTML 实体编码;JS/属性/URL 上下文需分别用对应编码器(如 OWASP Java Encoder 的 Encode.forHtml/forJavaScript/forUriComponent)。CSP:通过响应头 Content-Security-Policy 限制脚本来源,如 default-src 'self'; script-src 'self',Spring Security 可配置 headers(headers -> headers.contentSecurityPolicy("..."))。HttpOnly Cookie:设置 Cookie 的 HttpOnly 标志,使 JS 无法读取会话 Cookie,Spring Security 的 Session Cookie 默认 HttpOnly,自定义 Cookie 用 Cookie.setHttpOnly(true)。三者协同:输出编码治本(消除注入)、CSP 兜底(阻断脚本执行)、HttpOnly 保护会话数据(降低窃取后果)。工程上还应输入白名单消毒(富文本用 OWASP Java HTML Sanitizer)。注意 DOM 型 XSS 需在 JS 层正确处理,服务端编码不一定覆盖。
本题考察 XSS 的 Java 防御。核心是"输出编码 + CSP + HttpOnly 三层"。回答应点出具体 Java API 与配置。