XSS(Cross-Site Scripting,跨站脚本攻击)是一种常见的Web安全漏洞,攻击者通过在网页中注入恶意脚本,当其他用户浏览该页面时,脚本会在用户浏览器中执行,从而窃取用户数据、会话令牌或进行其他恶意操作。
01XSS 的类型与攻击机制
1. 存储型 XSS
恶意脚本被持久化存储在服务端(数据库、评论、用户资料等),所有访问该页面的用户都会触发执行。
2. 反射型XSS
恶意脚本作为请求参数(如查询字符串)发送给服务器,服务器未经恰当编码便将其“反射”回响应页面。
3. DOM 型 XSS
漏洞存在于客户端脚本中,不涉及服务器端处理。前端 JavaScript 从不可信来源(如 location.hash、document.baseURI)读取数据,并将其不安全地写入危险的“接收器”(sink,如 innerHTML、document.write)中。
02防护措施
1. 基于上下文的输出编码
- HTML 正文:将 &、<、>、"、' 转换为 HTML 实体(如 <、>)。
- HTML 属性:将所有非字母数字字符编码为 &#xHH; 格式的十六进制实体。
- JavaScript:将非字母数字字符编码为 \uXXXX 格式的 Unicode 转义。
- URL 参数:使用标准的百分号编码,且仅编码参数值,不编码整个 URL 或路径片段。
- CSS:使用 \XX 或 \XXXXXX 十六进制格式。
2. 输入验证和过滤
- - 对所有用户输入进行严格的验证
- - 过滤或转义特殊字符(如<, >, &, ", ', /)
- - 使用白名单机制,只允许特定的安全内容
3. 严格 CSP
- 严格 CSP 是基于 nonce 或 hash 的 CSP,而非主机允许列表。其核心配置形如:
1Content-Security-Policy:
2 script-src 'nonce-{RANDOM}' 'strict-dynamic';
3 object-src 'none';
4 base-uri 'none';
- 设置HttpOnly 标志的Cookie,防止JavaScript访问敏感Cookie
4. 使用安全框架和库
- - 使用现代前端框架(如React、Vue、Angular),它们有内置的XSS防护机制
- - 使用专门的库如DOMPurify来清理HTML
5. 其他措施
- 应避免将不可信数据写入 innerHTML、document.write、eval、setTimeout(字符串参数形式)等危险接收器。改用textContent、insertAdjacentText、createTextNode、以及 setAttribute 配合安全的属性名。
- 对动态生成的JavaScript代码进行严格审查
- 定期进行安全审计和渗透测试
Tip
ES6“标签模板”的一个重要应用,就是过滤 HTML 字符串,防止用户输入恶意内容。