CSP内容安全策略简介

https://www.html5rocks.com/en/tutorials/security/content-security-policy/

Content Security Policy (CSP)

一般来说,CSP作为黑客/白名单机制,用于扩展程序加载或执行的资源。

Web的安全模式植根于同一起源策略。代码https://mybank.com只能访问https://mybank.com数据,并且https://evil.example.com绝对不允许访问。每个起源与网络的其余部分保持隔离,为开发人员提供了一个安全的沙箱,用于构建和播放。在理论上,这是非常辉煌的。实际上,攻击者发现了颠覆系统的聪明方法。

例如,跨站脚本(XSS)攻击绕过同一起源策略,通过欺骗网站将恶意代码与预期内容一起发送。这是一个巨大的问题,因为浏览器将页面上显示的所有代码信任为该页面安全来源的合法部分。该XSS小抄是一个攻击者可能利用通过注入恶意代码来破坏这种信任的方法的旧有代表性的横截面。如果一个攻击者成功地注入了任何代码,那么它几乎是游戏过程:用户会话数据被泄露,应该保密的信息被过滤到坏人。我们显然希望如果可能的话。

本教程强调了一个有希望的新防御,可以显着降低XSS攻击在现代浏览器中的风险和影响:内容安全策略(CSP)。

来源白名单

XSS攻击利用的核心问题是浏览器无法区分旨在成为应用程序一部分的脚本以及第三方恶意注入的脚本。例如,本文顶部的Google +1按钮从https://apis.google.com/js/plusone.js本页面的上下文加载并执行代码。我们相信该代码,但我们不能指望浏览器找出自己的代码apis.google.com是真棒,而代码apis.evil.example.com可能不是。浏览器愉快地下载并执行页面请求的任何代码,无论来源如何。

CSP定义了HTTP头,而不是盲目信任服务器提供的所有信息,Content-Security-Policy可以允许您创建信任内容源的白名单,并指示浏览器仅从这些来源执行或呈现资源。即使攻击者可以找到一个注入脚本的孔,脚本也不会与白名单匹配,因此不会被执行。

由于我们信任apis.google.com提供有效的代码,我们相信自己也做同样的事情,我们定义一个策略,只允许脚本在来自这两个来源之一时执行:

Content-Security-Policy: script-src 'self' https://apis.google.com

简单吧?您可能猜到,script-src是一个指令,它控制特定页面的一组与脚本相关的权限。我们已经指定'self'了一个有效的脚本来源,https://apis.google.com另一个脚本。浏览器将尽可能地apis.google.com通过HTTPS从当前页面的起源下载并执行JavaScript 。

通过定义此策略,浏览器将简单地抛出错误,而不是从任何其他源加载脚本。当一个聪明的攻击者确实设法将代码注入您的网站时,她会长期运行错误信息,而不是她期望的成功:

CSP内容安全策略简介_第1张图片
csp-error.png

政策适用于各种资源

虽然脚本资源是最明显的安全风险,但CSP提供了一组丰富的策略指令,可以对页面允许加载的资源进行相当精细的控制。你已经看到了script-src,所以这个概念应该是清楚的。我们快速浏览其余的资源指令:

  • base-uri限制页面元素中可能出现的网址。
  • child-src列出了工作人员和嵌入式框架内容的URL。例如:child-src https://youtube.com可以嵌入来自YouTube的视频,但不能从其他来源嵌入视频。使用此代替不推荐使用的frame-src指令。
  • connect-src 限制您可以连接的来源(通过XHR,WebSockets和EventSource)。
  • font-src指定可以提供网络字体的起源。Google的Web字体可以通过启用font-src https://themes.googleusercontent.com
  • form-action列出从
    标签提交的有效端点。
  • frame-ancestors指定可以嵌入当前页面的源代码。该指令适用于,