csp通过http响应头或标签配置,核心是定义`default-src`和`script-src`等指令来限制资源加载来源。它不能100%防住xss,因为csp无法拦截dom-based xss、内联脚本(除非使用nonce)以及部分浏览器扩展注入的恶意代码。

如何配置基础CSP策略
在服务器响应头中添加`Content-Security-Policy`字段,指定允许的脚本、样式和图片源。例如,只允许同源资源和CDN,禁止内联脚本。

server.addHeader("Content-Security-Policy", "default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline'; img-src *; report-uri /csp-report")
上述配置中,`default-src 'self'`限制所有资源默认同源;`script-src`额外允许CDN;`style-src`包含`'unsafe-inline'`以兼容现有内联样式;`report-uri`用于收集违规报告。
CSP对不同类型XSS的防护效果
CSP能有效缓解反射型和存储型XSS,但对DOM-based XSS防护有限,且无法阻止已执行的内联脚本或特定攻击向量。

// 示例:CSP阻止外部脚本注入 <script src="https://evil.com/malicious.js"></script> // CSP会拦截此请求 // 但以下情况CSP可能失效: <script>eval(document.cookie)</script> // 若未禁用unsafe-inline,则仍执行
当`script-src`未包含`'unsafe-inline'`时,内联脚本会被阻止;但若存在`'unsafe-inline'`,攻击者可直接利用内联脚本绕过CSP。此外,DOM-based XSS如`location.hash`被直接解析为HTML,CSP无法干预。
基于nonce机制的具体问题与解决方案
使用`nonce`属性可为特定内联脚本授权,解决CSP与内联脚本冲突的问题,同时保持高安全性。
const nonce = generateRandomNonce();
server.setHeader("Content-Security-Policy", `script-src 'nonce-${nonce}' 'self'`);
html += `<script nonce="${nonce}">console.log('safe')</script>`;
每次请求生成唯一`nonce`,并在`script-src`中声明。只有携带匹配`nonce`属性的内联脚本才能执行,其他内联脚本被阻断。此方法需服务端动态生成并注入HTML,确保每个会话的`nonce`不同,防止重放攻击。











