默认配置下,CSP 甚至不允许执行内联代码 ( 块内容,内联事件,内联样式),以及禁止执行eval(), 和 setInterval。为什么要这么做呢?因为制定来源白名单依旧无法解决 XSS 攻击的最大威胁:内联脚本注入。浏览器无法区分合法内联脚本与恶意注入的脚本,所以通过默认禁止内联脚本来有效解决这个问题。

    事实上我们并不推荐使用内联脚本混合的开发方式,使用外部资源,浏览器更容易缓存,对开发者也容易阅读理解,并且有助于编译和压缩。当然,如果不得不需要内联脚本和样式,可以通过设置 ,来解除这一限制。

    目前浏览器对 CSP 的支持情况可以在

    1.设置 HTTP 头的 Content-Security-Policy 字段(旧版 X-Content-Security-Policy)

    2.设置页面的 <meta> 标签

    上述例子进行了配置

    • script: 只信任当前域名
    • object-src: 不允许加载任何插件资源(如object, embed, applet 等标签引入的 flash 等插件)
    • 样式: 只信任来自 cdn.example.org 和 third-party.org
    • 框架内容(如 iframe): 必须使用 https 协议加载
    • style-src:样式表
    • img-src:图像
    • media-src:媒体文件(音频和视频)
    • font-src:字体文件
    • object-src:插件(比如 Flash)
    • child-src:框架

    如果不为某条配置设置具体的值,则默认情况下,该配置在运行时认为你指定 * 作为有效来源(例如,你可以从任意位置加载字体,没有任何限制)。也可以设置 default-src 的值,来代替各个选项的默认值。

    每个配置选项的值,可填入以下内容

    • 主机名:example.org,https://example.com:443
    • 路径名:example.org/resources/js/
    • 通配符:*.example.org,*://*.example.com:*(表示任意协议、任意子域名、任意端口)
    • 协议名:https:、data:
    • 关键字 ‘self’:当前域名,需要加引号
    • 关键字 ‘none’:禁止加载任何外部资源,需要加引号

    这里不对资源白名单的配置具体介绍了,更多内容可参阅: