前端安全:内容安全策略
在我之前关于安全的文章中,我写了关于npm audit
脚本完整性的内容。接下来是内容安全策略(简称CSP)。
这可以作为服务器上的响应头添加,也可以作为<meta>
html 中的标签添加。
我将在这里重点讨论后者。
CSP 将告诉网页允许从哪些域加载图像、字体、iframe、脚本等:
<meta http-equiv="Content-Security-Policy" content="
default-src;
script-src 'self';
style-src 'self';
img-src 'self' data:;
font-src;
connect-src 'self';
media-src 'self';
object-src 'none';
child-src;
frame-src;
form-action;
base-uri;
manifest-src 'self';
">
双引号内是一个长字符串,为了清晰起见,我添加了换行符和制表符。
每个条目都以分号结尾。;
注意“self”这个词。它允许你从与当前文档相同的域运行各种类型。
脚本
要允许来自外部站点的脚本(可能是unpkg.com之类的交付网络) ,请将其添加unpkg.com
到script-src
CSP 的 -part 中:
script-src 'self' unpkg.com;
Cloudflare 提供了边缘缓存和/或资源压缩功能,以及“Rocket Loader™”,它可以缩短使用 JavsScript 的网站的渲染时间。我在我的网站上使用了它,但必须将其添加到我的 CSP 中:
script-src 'self' ajax.cloudflare.com;
新条目只是一个空格,因此组合起来,当前条目script-src
看起来像这样:
script-src 'self' unpkg.com ajax.cloudflare.com;
谷歌字体
对于 Google 字体,您必须向font-src
和添加条目style-src
:
font-src fonts.gstatic.com;
style-src 'self' fonts.googleapis.com ;
YouTube
对于 YouTube,您需要条目,frame-src
因为它基于 iframe ,并且它也提供img-src
缩略图。CSP 并不总是那么容易,但它是为您的网站添加额外保护的最快方法!
frame-src *.youtube.com;
img-src 'self' img.youtube.com data:;
如果您还包括 YouTube API,则必须将其添加到script-src
:
script-src *.youtube.com;
YouTube 视频可以使用这些附加功能,但偶尔会因其“doubleclick”网络和其他网络而产生错误。您可以忽略这些,或者将它们添加到您的 CSP(如果您信任它们!):
script-src: https://www.googleadservices.com https://googleads.g.doubleclick.net https://www.google.com
img-src: https://www.google.com
frame-src: https://bid.g.doubleclick.net
Vimeo
Vimeo 只需要frame-src
:
frame-src: *.vimeo.com
但是如果您想使用他们的 API,script-src
也请添加一个条目:
script-src: *.vimeo.com
警告:营销人员和 SEO 人员讨厌CSP!
有了 CSP,营销人员就不能再通过Google Tag Manager或类似工具添加酷炫的新跟踪脚本了。所以,准备好听到大量投诉吧,除非你创建一个 CMS 块,让他们可以自行添加/删除 CSP 条目!
Google Chrome支持的 CSP 条目远不止上面列出的这些。遗憾的是,其中大多数条目在Apple Safari中无法正常工作,甚至可能导致其无法解析 JavaScript,因此请务必在所有浏览器中进行测试。
更多信息请见:
https://content-security-policy.com/
并帮助您创建一个:
https://report-uri.com/home/generate
奖励:添加预连接
在向 CSP 添加条目时,<link rel="preconnect">
为相同条目添加 -tag,以加快您的网站与这些资源之间的通信速度。
以“Google 字体”为例:
<link rel="preconnect" href="https://fonts.gstatic.com">
感谢阅读!
鏂囩珷鏉ユ簮锛�https://dev.to/madsstoumann/frontend-security-content-security-policy-17dl