跨站脚本攻击(Cross-Site Scripting,简称 XSS)是一种常见的 Web 安全漏洞,攻击者通过注入恶意脚本到网页中,诱导用户浏览,从而窃取用户的敏感信息、冒充用户行为、进行恶意操作等。
XSS 攻击类型
-
存储型 XSS(Stored XSS):
- 恶意脚本被存储在服务器端(如数据库)中。当用户访问受影响的页面时,恶意脚本会被加载并执行。
-
反射型 XSS(Reflected XSS):
- 恶意脚本通过 URL 参数或表单提交直接传递到服务器,服务器返回的响应中包含这些恶意脚本。当用户点击恶意链接时,脚本会被加载并执行。
-
DOM 型 XSS(DOM-based XSS):
- 恶意脚本在客户端通过修改页面的 DOM 结构来执行,不涉及服务器端的交互。常见于使用 JavaScript 操作 DOM 的页面。
避免 XSS 攻击的方法
1. 输入验证和清理
-
输入验证:
- 对用户输入进行严格的验证,只允许合法的字符和格式。对于不同类型的输入(如用户名、电子邮件、URL等)设定不同的验证规则。
-
输入清理:
- 移除或转义输入中的潜在恶意字符。例如,对于 HTML 内容可以移除
<script>
标签,或者将<
转义为<
。
- 移除或转义输入中的潜在恶意字符。例如,对于 HTML 内容可以移除
2. 输出编码和转义
-
HTML 转义:
- 将 HTML 中的特殊字符(如
<
,>
,&
等)进行转义。例如,将<
转换为<
,防止其被浏览器解释为 HTML 代码。
- 将 HTML 中的特殊字符(如
-
JavaScript 转义:
- 在将数据插入到 JavaScript 中时,进行相应的转义处理。例如,将字符串中的单引号和双引号进行转义。
-
URL 转义:
- 对 URL 中的参数进行编码,防止恶意脚本通过 URL 参数传递。
3. 使用安全的库和框架
-
模板引擎:
- 使用安全的模板引擎(如 Thymeleaf、Handlebars.js 等)自动处理转义,避免直接拼接 HTML 代码。
-
安全库:
- 使用成熟的安全库来处理输入验证和输出转义。例如,OWASP 提供的 Java Encoder Project 可以安全地编码和转义数据。
4. 内容安全策略(CSP)
-
CSP:
- 配置内容安全策略(Content Security Policy,CSP)头部,限制页面中可以执行的脚本来源。例如,只允许来自同一域名的脚本执行,禁止内联脚本(
'unsafe-inline'
)等。
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com;
- 配置内容安全策略(Content Security Policy,CSP)头部,限制页面中可以执行的脚本来源。例如,只允许来自同一域名的脚本执行,禁止内联脚本(
5. HTTP Only 和 Secure Cookie
-
HTTP Only Cookie:
- 设置 Cookie 的
HttpOnly
属性,防止通过 JavaScript 访问 Cookie。
- 设置 Cookie 的
-
Secure Cookie:
- 设置 Cookie 的
Secure
属性,确保 Cookie 只能通过 HTTPS 传输。
- 设置 Cookie 的
示例代码
输入验证和清理示例
import org.apache.commons.lang3.StringUtils;
public class InputValidationExample {
public static String sanitizeInput(String input) {
if (StringUtils.isEmpty(input)) {
return input;
}
return input.replaceAll("[<>]", ""); // 移除 < 和 > 符号
}
public static void main(String[] args) {
String userInput = "<script>alert('XSS');</script>";
String sanitizedInput = sanitizeInput(userInput);
System.out.println("Sanitized Input: " + sanitizedInput);
}
}
输出编码示例
import org.owasp.encoder.Encode;
public class OutputEncodingExample {
public static void main(String[] args) {
String userInput = "<script>alert('XSS');</script>";
// HTML 转义
String encodedHtml = Encode.forHtml(userInput);
System.out.println("Encoded HTML: " + encodedHtml);
// JavaScript 转义
String encodedJs = Encode.forJavaScript(userInput);
System.out.println("Encoded JavaScript: " + encodedJs);
// URL 转义
String encodedUrl = Encode.forUriComponent(userInput);
System.out.println("Encoded URL: " + encodedUrl);
}
}
内容安全策略(CSP)示例
在服务器响应头中添加 CSP 头部:
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com;
或者在 HTML 中添加 CSP 头部:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://trusted.cdn.com;">
总结
XSS 攻击是常见的 Web 安全威胁,通过输入验证、输出编码、使用安全的库和框架、配置内容安全策略(CSP)等方法,可以有效防止 XSS 攻击。作为开发者,需始终保持安全意识,遵循安全编码实践,保护用户数据和系统安全。