找回密码
 立即注册
首页 资源区 代码 防止跨站脚本攻击(XSS)(完整版HTTP安全响应头-CSP) ...

防止跨站脚本攻击(XSS)(完整版HTTP安全响应头-CSP)

尝琨 4 小时前
一、CPS简介

Content-Security-Policy(CSP,内容安全策略)是一种由浏览器实施的安全机制,用于防止跨站脚本攻击(XSS)数据注入攻击点击劫持等常见 Web 安全威胁。
它通过白名单机制控制网页可以加载和执行哪些资源,从而有效减少恶意代码的执行机会。
二、核心作用

1、防止 XSS 攻击

禁止内联脚本执行,限制脚本只能从可信域名加载,即使攻击者注入恶意脚本,也无法执行。
2、控制资源加载来源

可限制图片、样式、字体、iframe、Ajax 请求等资源的来源,防止加载恶意内容。
3、防止数据泄露和点击劫持

通过限制表单提交目标、iframe 嵌入来源等方式,增强页面行为的安全性。
三、CSP 的设置方式

1、通过 HTTP 响应头设置(推荐)

示例:
  1.  Content-Security-Policy: script-src 'self'; object-src 'none'; img-src * data:;
复制代码
含义:

  • 只允许加载当前域名的脚本;
  • 禁止加载任何  标签资源;
  • 图片可从任意来源加载,包括 data URI。
四、配置说明

1、常用指令(Directive)说明

指令功能default-src默认资源加载策略(其他未指定指令的 fallback)script-src控制 JavaScript 的来源style-src控制 CSS 的来源img-src控制图片的来源connect-src控制 Ajax、WebSocket 等连接的目标frame-src控制 iframe 的来源form-action限制表单提交的目标地址report-uri / report-to设置违规报告接收地址,用于安全监控2、指令值(Source)说明

值含义'self'只允许同源资源'none'禁止任何资源'unsafe-inline'允许内联脚本/样式(⚠️降低安全性)'unsafe-eval'允许使用 eval() 等动态执行代码(⚠️高风险)https://example.com允许指定域名nonce-仅允许带有匹配 nonce 属性的脚本sha256-仅允许哈希匹配的内联脚本五、注意事项

1、生产前必做,仅报告模式

先在 Content-Security-Policy-Report-Only 头里跑 1-3 天,只记录不阻断:
nginx配置如下:
  1.  add_header Content-Security-Policy-Report-Only
  2. "default-src 'self'; script-src 'self' https://static.xxx.com; report-uri /csp-report" always;
复制代码
观察 /csp-report 接收到的 JSON 违规日志,确认无合法资源被误杀后,再改成正式的 Content-Security-Policy 头 。
2、script-src 没有nonce/hash 不能使用 'unsafe-inline'

否则会导致所有内联  和 DOM 级 element.onclick = ... 放行。
攻击示例:
  1.  #请求
  2. https://victim.com/search?q=
  3. alert(document.cookie)
复制代码
  1.  #返回结果
  2. 搜索关键词:alert(document.cookie)
复制代码
错误配置示例:
  1.  add_header Content-Security-Policy "
  2. default-src 'self';
  3. script-src  'self'  data:;
复制代码
 3、script-src 不能允许 data

否则会导致 data:text/javascript,alert(1) 这种 Base64 内嵌脚本会被执行。
攻击者只需注入 <script src="data:text/javascript,..."> 即可完成 XSS,完全绕过域名白名单。
错误配置示例:
  1.  add_header Content-Security-Policy "
  2. default-src 'self';
  3. script-src  'self' 'unsafe-inline';
复制代码
六、服务器配置示例

1、NGINX配置示例

在 server {} 块里加一行:
  1.  server {
  2. listen 80;
  3. server_name example.com;
  4. # 全部响应都附加 CSP
  5. add_header Content-Security-Policy "
  6. default-src 'self' localhost:443 'unsafe-inline' 'unsafe-eval' blob: data: ;
  7. sscript-src 'self' 'unsafe-inline' 'unsafe-eval';;
  8. style-src   'self' https://fonts.googleapis.com;
  9. img-src     'self' data: https:;
  10. font-src    'self' https://fonts.gstatic.com;
  11. object-src  'none';
  12. frame-ancestors 'self';
  13. upgrade-insecure-requests;
  14. " always;
  15. location / {
  16. proxy_pass http://127.0.0.1:8080;
  17. # 其他代理头省略
  18. }
  19. }
复制代码
重启 Nginx 后,所有 HTML 响应都会带上该头字段 。
2、Tomcat配置示例

修改 conf/web.xml,追加全局过滤器:
  1.  HttpHeaderSecurityFilter
  2. org.apache.catalina.filters.HttpHeaderSecurityFilter
  3. content-security-policy
  4. default-src 'self';
  5. script-src  'self' 'unsafe-inline';
  6. style-src   'self' 'unsafe-inline';
  7. img-src     'self' data:;
  8. object-src  'none';
  9. frame-ancestors 'self';
  10. HttpHeaderSecurityFilter
  11. /*
复制代码
重启 Tomcat 后,所有响应自动携带 CSP 头
3、Spring Boot 示例
  1. public class SecurityConfig {
  2. @Bean
  3. SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
  4. http
  5. .headers(headers -> headers
  6. .contentSecurityPolicy(csp -> csp.policyDirectives(
  7. "default-src 'self'; " +
  8. "script-src  'self' https://cdn.jsdelivr.net; " +
  9. "style-src   'self' https://fonts.googleapis.com; " +
  10. "img-src     'self' data: https:; " +
  11. "font-src    'self' https://fonts.gstatic.com; " +
  12. "object-src  'none'; " +
  13. "frame-ancestors 'self'; " +
  14. "upgrade-insecure-requests;")));
  15. return http.build();
  16. }
  17. }
复制代码
Spring Boot 3.x 可用,启动后观察响应头已含 Content-Security-Policy
原文链接:https://www.cnblogs.com/ljbguanli/p/19113503

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册