安全需求文档该怎么写才能防XSS漏洞?

UX-彩云 阅读 43

我们在做用户评论功能时,测试发现XSS漏洞,但安全需求文档里只写了“过滤危险字符”,具体该怎么做才能有效防范呢?

之前尝试用正则表达式过滤了<script>标签和特殊字符,但测试人员用Unicode编码绕过了,导致漏洞依然存在。现在需要在安全需求阶段明确具体措施,但不知道该写哪些技术点,比如输入验证、输出编码、CSP策略这些要怎么具体描述?

比如现在有段评论内容处理代码:


function sanitizeInput(input) {
  return input.replace(//g, '>');
}

安全需求文档该怎么写才能确保开发时不会漏掉关键防护措施?需要具体到什么技术细节?

我来解答 赞 7 收藏
二维码
手机扫码查看
2 条解答
FSD-子璐
防XSS不是简单过滤几个标签就能搞定的,特别是用户输入场景多、内容格式复杂的情况下。安全需求文档里不能只写“过滤危险字符”,要具体到技术实现,否则开发很容易漏掉关键点。

下面是我整理的几个必须写进需求文档的技术点,都是在实际项目中验证过的方法:

### 1. 输入验证(Input Validation)
- **白名单校验**:对所有用户输入做白名单限制,比如评论内容允许字母、数字、部分符号,禁止所有HTML标签。
- **字段类型限制**:如用户名只能是字母数字组合,邮箱必须符合email格式,不能包含特殊字符或脚本结构。

### 2. 输出编码(Output Encoding)
- **根据不同输出位置使用不同的编码方式**:
- HTML内容:使用HTML实体编码(如 <<>>
- JS内容:使用JS编码(encodeURIComponentescape
- CSS内容:使用CSS编码
- URL参数:使用 encodeURIComponent
- 不要用简单的字符串替换,推荐使用成熟的库(比如 DOMPurify、OWASP的编码库)来处理。

### 3. 使用内容安全策略(CSP)
- **配置HTTP头 Content-Security-Policy**,明确允许哪些源加载脚本、样式、图片等资源。
- 对评论等富文本内容,避免使用 unsafe-inline,应使用nonce或分离到独立iframe中。

### 4. 富文本处理要特别小心
- 如果评论支持HTML格式(比如加粗、链接),不要自己写正则,直接使用像 [DOMPurify](https://github.com/cure53/DOMPurify) 这类经过验证的开源库。
- 配置白名单标签和属性,比如只允许 , , ,并限制 href 的协议为 http(s)

### 5. HTTP头加固
- 设置 X-Content-Type-Options: nosniff
- 设置 X-Frame-Options: DENYSAMEORIGIN
- 启用 X-XSS-Protection: 1; mode=block

### 示例:评论内容处理改进
你原来的函数只是简单替换 >,显然不够。可以改用更全面的编码函数,或直接引入库:

function sanitizeInput(input) {
const div = document.createElement('div');
div.textContent = input;
return div.innerHTML;
}


或者使用 DOMPurify:

const clean = DOMPurify.sanitize(dirty);


### 安全文档建议写法
在安全需求文档中,建议写成类似如下格式:

> **XSS防护要求**
>
> 1. 所有用户输入必须进行白名单校验,禁止非法字符(如