记一次XSS漏洞排查:一个引号引发的血案

David Ng | 2026-08-13T13:32:00 | Frontend, Security

一个存储型XSS漏洞的完整排查过程,从发现到修复,以及CSP配置的最佳实践

# 记一次XSS漏洞排查:一个引号引发的血案 安全扫描报了个Stored XSS,排查发现是用户昵称没做过滤,直接拼到了HTML里。 ## 漏洞场景 ```html {{nickname}} ``` 每个看到这个用户的人,cookie都被偷了。 ## 修复方案 ```javascript // 方案1:HTML转义(最基础) function escapeHtml(str) { var div = document.createElement('div'); div.appendChild(document.createTextNode(str)); return div.innerHTML; } // 方案2:服务端用成熟的库 // Java: org.owasp.encoder // Node: DOMPurify // Python: bleach ``` ## CSP配置 ```nginx # 配置Content Security Policy,最后一道防线 add_header Content-Security-Policy " default-src 'self'; script-src 'self' 'nonce-{random}'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; connect-src 'self' https://api.example.com; " always; ``` CSP可以阻止内联脚本执行,即使XSS注入成功,恶意脚本也跑不了。 教训:**永远不要信任用户输入**,所有输出到HTML的数据都要转义。这是安全的第一原则。

← Back to Blog