• 确博日记
  • 工作时间:09:30 pm-06:24 pm

除了转义字符外其它防止XSS攻击的方式

除转义字符外,防止 XSS 攻击需从 “输入过滤”“输出场景适配”“环境安全限制” 等多个维度构建防护体系,以下是核心方法及建站时的实操方案:

一、严格的输入验证(从源头过滤危险内容)

转义是 “输出时的防护”,而输入验证是 “接收数据时就拦截危险内容”,二者结合能大幅降低风险。核心原则是:只允许 “预期内的合法内容” 通过,拒绝一切超出规则的输入。

  1. 基于规则的输入过滤
    • 白名单验证:明确规定允许的字符、格式(如手机号只能是 11 位数字,用户名只能含字母 / 数字 / 下划线),其他内容直接拦截。
    • 黑名单过滤(辅助):针对已知危险字符(如<script>、onclick)进行过滤(但需注意:黑名单容易被绕过,需配合白名单使用)。
  1. 限制输入长度

大多数 XSS 攻击需要插入较长的恶意代码(如<img src=x onerror=alert(1)>),限制输入长度(如评论最多 500 字、昵称最多 20 字)可增加攻击难度。

确博建站

二、根据输出场景选择适配的防护策略

转义并非 “万能方案”—— 不同输出场景(如 HTML 正文、HTML 属性、URL 参数、JS 代码)对危险内容的解析逻辑不同,需针对性防护。

  1. 输出到 HTML 属性时的额外防护

即使已转义,动态设置href、src等属性仍可能存在风险(如href="javascript:攻击代码")。需:

    • 禁止动态设置javascript:、vbscript:等危险协议;
    • 若需设置链接,验证 URL 是否以http://或https://开头(确保是合法链接)。
  1. 输出到 JavaScript 代码中的防护

若需在 JS 代码中使用用户输入(如const user = '${userInput}';),仅用 HTML 转义无效(JS 解析规则与 HTML 不同),需:

    • 使用JSON.stringify()转义(将用户输入转为安全的 JSON 字符串);
    • 避免直接拼接用户输入到 JS 代码中(优先通过data-*属性传递,再用 JS 读取)。
  1. 输出到 CSS 中的防护

若动态设置 CSS(如element.style.color = userInput),需限制输入为 “纯颜色值”(如#fff、red),禁止包含expression()(IE 旧版支持的 JS 执行语法)等危险内容。

三、通过环境限制降低攻击影响

即使出现防护漏洞,也可通过限制浏览器权限、禁用危险功能,减少 XSS 攻击的危害范围。

  1. 使用 CSP(内容安全策略)

CSP 是浏览器提供的安全机制,通过 HTTP 响应头Content-Security-Policy限制 “哪些资源可以加载”“哪些代码可以执行”,从根本上阻止 XSS 代码执行。

    • 核心规则示例(后端配置,如 Nginx、Apache):

效果:若攻击者注入<script src="恶意域名.js"></script>,浏览器会因 “不符合 default-src 规则” 拒绝加载;内联的<script>alert(1)</script>也会被拦截。

  1. 禁用不必要的 HTML 属性和标签
    • 前端渲染时,避免使用onclick、onerror等 “事件属性”(这些属性可被注入 JS 代码),改用 JS 添加事件监听(addEventListener);
    • 对用户生成内容(如评论),禁止包含<iframe>、<video>等可能加载外部资源的标签(如需支持富文本,用专用编辑器并限制允许的标签)。
  1. 使用 HttpOnly 和 Secure 属性保护 Cookie

XSS 攻击的常见目的是窃取用户 Cookie(如登录凭证),通过设置 Cookie 属性可防止窃取:

    • HttpOnly:禁止 JS 通过document.cookie读取 Cookie(即使存在 XSS,也无法获取 Cookie);
    • Secure:仅在 HTTPS 协议下传输 Cookie,避免被中间人截取。

四、富文本场景的特殊防护(允许部分 HTML 时)

若网站需要支持富文本(如博客编辑器、商品详情,需允许<b>、<img>等标签),直接转义会导致格式丢失,需用 “白名单过滤 + 转义” 结合的方式:

  1. 使用专用富文本过滤库

手动过滤容易遗漏危险标签,建议使用成熟库(如DOMPurify):

  1. 严格限制标签和属性范围

即使使用库,也需明确 “只允许必要的标签和属性”(如富文本中无需script、iframe,则完全禁止);对<img>的src,仅允许http://、https://开头的链接(禁止data:伪协议,避免注入 base64 编码的 JS)。

总结:多层防护比单一方法更可靠

转义字符是基础防护,但需结合:

  • 输入验证(拦截危险内容);
  • 场景适配输出(不同场景用不同策略);
  • 环境限制(CSP、Cookie 保护等);
  • 富文本专用过滤(允许部分 HTML 时)。

例如:一个评论系统的防护流程应为 “输入验证(过滤长度和非法字符)→ 存储前过滤(黑名单辅助)→ 输出时转义(textContent)→ 后端配置 CSP(兜底拦截)”。这种 “多层防御” 能最大程度降低 XSS 攻击风险。

如果需要针对某类场景(如富文本编辑器、登录表单)细化防护方案,可以进一步说明需求。

  • 在线列表
    1589813

  • 在线提交