黑白名单结合过滤
< > " ' &
)及敏感关键字(如 javascript:
、onerror=
)。 // 示例:过滤<script>标签及事件属性 function sanitizeInput(input) { return input.replace(/<script.*?>.*?</script>/gi, '') .replace(/onw+=["'][^"']*["']/gi, ''); }
- _ .
)。使用权威过滤库
避免手动编写过滤规则,推荐采用成熟工具:
htmlspecialchars()
或Python的html.escape()
数据展示前,根据输出位置选择编码方式:
输出场景 | 编码方法 | 工具示例 |
---|---|---|
HTML正文 | HTML实体编码 | < → < ," → |
HTML属性 | 属性编码(含引号转义) | Vue/React自动转义属性值 |
JavaScript代码 | Unicode转义或十六进制编码 | u003C 代替 < |
URL参数 | URL编码 | encodeURIComponent() |
通过HTTP响应头Content-Security-Policy
限制脚本加载源,阻断非规资源:
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.cdn.com; img-src *; frame-src 'none';
script-src 'self'
:仅允许同域脚本 'unsafe-inline'
和 'unsafe-eval'
:默认禁用以阻止内联脚本 report-uri
收集策略违规报告(便于调试)。X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
<p> <a> <strong>
)。 HttpOnly
和Secure
,阻止JavaScript窃取。某社交平台因未对用户评论过滤,导致攻击者在个人简介插入反面脚本,窃取超过10万用户Cookie,事后平台采用CSP+输入编码方案,破绽修复后无二次发生。
存储型XSS防御需覆盖输入过滤、输出编码、策略控制、持续监控四层体系,技术方案需与开发流程结合,建议将安全规范纳入CI/CD管道,实现自动化检测。
参考文献