Web 安全之内容安全策略(Content-Security-Policy,CSP)配置问题

简单的配置方式:Content-Security-Policy,X-Frame-Options头未设置”警告的过滤器

1.CSP 简介

内容安全策略(Content Security Policy,简称CSP)是一种以可信白名单作机制,来限制网站是否可以包含某些来源内容,缓解广泛的内容注入漏洞,比如 XSS。 简单来说,就是我们能够规定,我们的网站只接受我们指定的请求资源。默认配置下不允许执行内联代码(

(2) 内联事件。

 

(3) 内联样式

虽然CSP中已经对script-src和style-src提供了使用”unsafe-inline”指令来开启执行内联代码,但为了安全起见还是慎用”unsafe-inline”。

  • EVAL相关功能被禁用

    用户输入字符串,然后经过eval()等函数转义进而被当作脚本去执行。这样的攻击方式比较常见。于是乎CSP默认配置下,eval() , newFunction() , setTimeout([string], …) 和setInterval([string], …)都被禁止运行。
    比如:

    alert(eval("foo.bar.baz"));
    window.setTimeout("alert(‘hi‘)", 10); window.setInterval("alert(‘hi‘)", 10); 
    new Function("return foo.bar.baz");

    如果想执行可以把字符串转换为内联函数去执行。

    alert(foo && foo.bar && foo.bar.baz);
    window.setTimeout(function() { alert(‘hi‘); }, 10);
    window.setInterval(function() { alert(‘hi‘); }, 10);
    function() { return foo && foo.bar && foo.bar.baz };

    同样CSP也提供了”unsafe-eval”去开启执行eval()等函数,但强烈不建议去使用”unsafe-eval”这个指令。

  • 6.CSP 分析报告

    可以用report-uri指令使浏览器发送HTTP POST请求把攻击报告以JSON格式传送到你指定的地址。接下来给大家介绍你的站点如何配置来接收攻击报告。

    • 启用报告

      默认情况下,违规报告不会发送。为了能使用违规报告,你必须使用report-uri指令,并至少提供一个接收地址。

      Content-Security-Policy: default-src self; report-uri http://reportcollector.example.com/collector.cgi

      如果想让浏览器只汇报报告,不阻止任何内容,可以改用Content-Security-Policy-Report-Only头。

    • 违规报告语法

      该报告JSON对象包含以下数据:

      blocked-uri:被阻止的违规资源
      document-uri:拦截违规行为发生的页面
      original-policy:Content-Security-Policy头策略的所有内容
      referrer:页面的referrer
      status-code:HTTP响应状态
      violated-directive:违规的指令
    • 违规报告例子

      http://example.com/signup.html 中CSP 规定只能加载cdn.example.com的CSS样式。

      Content-Security-Policy: default-src ‘none‘; style-src cdn.example.com; report-uri /test/csp-report.php

      signup.html中的代码类似与这样:

      
      
       
         Sign Up
         
       
       
         ... Content ...
       
      

      你能从上面的代码找出错误吗?策略是只允许加载cdn.example.com中的CSS样式。但signup.html试图加载自己域的style.css样式。这样违反了策略,浏览器会向 http://example.com/test/csp-report.php 发送POST请求提交报告,发送格式为JSON格式。

      {
        "csp-report": {
          "document-uri": "http://example.com/signup.html",
          "referrer": "",
          "blocked-uri": "http://example.com/css/style.css",
          "violated-directive": "style-src cdn.example.com",
          "original-policy": "default-src ‘none‘; style-src cdn.example.com; report-uri /_/csp-reports",
        }
      }

      你从上面可以看到blocked-uri给出了详细的阻断地址 http://example.com/css/style.css,但也并不是每次都是这样。比如试图从 http://anothercdn.example.com/stylesheet.css 加载CSS样式时,浏览器将不会传送完整的路径,只会给出 http://anothercdn.example.com/ 这个地址。这样做是为了防止泄漏跨域的敏感信息。

      服务端csp-report.php代码可以这样写:

       $val) {
          fwrite($file, $key . ‘: ‘ . $val . "
      ");
      }
      fwrite($file, ‘End of report.‘ . "
      ");
      fclose($file);
      ?>

    7.参考链接

    • http://www.ruanyifeng.com/blog/2016/09/csp.html
    • http://blog.topsec.com.cn/ad_lab/content-security-policy/
    • https://blog.csdn.net/qq_37943295/article/details/79978761
    • https://www.jianshu.com/p/b223c5b9d5ab
    • https://content-security-policy.com/
    • https://www.imuo.com/a/f7566a17dcfe788216bbc5245e91a631fcc259bfac97dc7f94bf8002ba38fa21
    • https://w3c.github.io/webappsec-csp/#intro
    • https://kuaibao.qq.com/s/20180522G095D900?refer=spider

    你可能感兴趣的:(WEB安全(漏洞))