当前位置: 首页 > 知识库问答 >
问题:

内容安全策略(CSP)是如何工作的?

司凡
2023-03-14

开发人员控制台中出现了一系列错误:

拒绝计算字符串

拒绝执行内联脚本,因为它违反了以下内容安全策略指令

拒绝加载脚本

拒绝加载样式表

这是怎么回事?内容安全策略(CSP)是如何工作的?如何使用内容安全策略HTTP头?

具体来说,如何。。。

  1. …允许多个源?
  2. …使用不同的指令?
  3. …使用多个指令?
  4. …处理端口?
  5. …处理不同的协议?
  6. …允许文件://协议?
  7. …使用内联样式、脚本和标记

最后:


共有2个答案

乐正乐湛
2023-03-14

您还可以启用Apache2mod_头。在Fedora上,它已默认启用。如果您使用Ubuntu/Debian,请按如下方式启用它:

# First enable headers module for Apache 2,
# and then restart the Apache2 service
a2enmod headers
apache2 -k graceful

在Ubuntu/Debian上,您可以在文件/etc/apache2/conf enabled/security.conf

#
# Setting this header will prevent MSIE from interpreting files as something
# else than declared by the content type in the HTTP headers.
# Requires mod_headers to be enabled.
#
#Header set X-Content-Type-Options: "nosniff"

#
# Setting this header will prevent other sites from embedding pages from this
# site as frames. This defends against clickjacking attacks.
# Requires mod_headers to be enabled.
#
Header always set X-Frame-Options: "sameorigin"
Header always set X-Content-Type-Options nosniff
Header always set X-XSS-Protection "1; mode=block"
Header always set X-Permitted-Cross-Domain-Policies "master-only"
Header always set Cache-Control "no-cache, no-store, must-revalidate"
Header always set Pragma "no-cache"
Header always set Expires "-1"
Header always set Content-Security-Policy: "default-src 'none';"
Header always set Content-Security-Policy: "script-src 'self' www.google-analytics.com adserver.example.com www.example.com;"
Header always set Content-Security-Policy: "style-src 'self' www.example.com;"

注意:这是文件的底部。只有最后三个条目是CSP设置。

第一个参数是指令,第二个是要白名单的源。我已经添加了谷歌分析和广告服务器,你可能已经有了。此外,我发现如果你有别名,例如,www.example.com和example.com配置在Apache

内联代码被认为是有害的,您应该避免它。将所有JavaScript代码和CSS复制到单独的文件中,并将它们添加到白名单中。

您可以查看其他标题设置并安装mod_security

进一步阅读:

https://developers.google.com/web/fundamentals/security/csp/

https://www.w3.org/TR/CSP/

哈栋
2023-03-14

Content Security Policymeta标记允许您定义可以从何处加载资源,防止浏览器从任何其他位置加载数据,从而降低XSS攻击的风险。这使得攻击者更难将恶意代码注入您的站点。

我把头撞在砖墙上,试图弄明白为什么CSP一个接一个地出现错误,但似乎没有任何关于它如何工作的简明、清晰的说明。因此,我试图简要地解释CSP的一些要点,主要集中在我发现难以解决的问题上。

为简洁起见,我不会在每个示例中编写完整的标记。相反,我将只显示content属性,因此说content=“default src'self'”的示例意味着:

<meta http-equiv="Content-Security-Policy" content="default-src 'self'">

1.如何允许多个来源?

您可以简单地在指令后以空格分隔的列表列出您的源:

content="default-src 'self' https://example.com/js/"

请注意,除了特殊的参数(如“self”)外,参数周围没有引号。此外,指令后面没有冒号()。只是指令,然后是一个以空格分隔的参数列表。

所有低于指定参数的内容都是隐式允许的。这意味着在上面的例子中,这些都是有效的来源:

https://example.com/js/file.js
https://example.com/js/subdir/anotherfile.js

但是,以下内容无效:

http://example.com/js/file.js
^^^^ wrong protocol

https://example.com/file.js
                   ^^ above the specified path

2.如何使用不同的指令?他们各自做什么?

最常见的指令是:

  • defaultsrc加载javascript、图像、CSS、字体、AJAX请求等的默认策略

还有其他的,但这些是你最可能需要的。

3.如何使用多个指令?

您可以在一个元标记中定义所有指令,方法是用分号()终止它们:

content="default-src 'self' https://example.com/js/; style-src 'self'"

4.如何处理端口?

除默认端口之外的所有端口都需要通过在允许的域后面添加端口号或星号来显式允许:

content="default-src 'self' https://ajax.googleapis.com http://example.com:123/free/stuff/"

上述情况将导致:

https://ajax.googleapis.com:123
                           ^^^^ Not ok, wrong port

https://ajax.googleapis.com - OK

http://example.com/free/stuff/file.js
                 ^^ Not ok, only the port 123 is allowed

http://example.com:123/free/stuff/file.js - OK

如前所述,您还可以使用星号显式允许所有端口:

content="default-src example.com:*"

5.我如何处理不同的协议?

默认情况下,只允许使用标准协议。例如,要允许WebSocketws://,您必须明确允许它:

content="default-src 'self'; connect-src ws:; style-src 'self'"
                                         ^^^ web Sockets are now allowed on all domains and ports.

6.如何允许文件协议file://

如果你想把它定义为这样,那就行不通了。相反,您将使用filesystem参数来允许它:

content="default-src filesystem"

7.如何使用内联脚本和样式定义?

除非明确允许,否则不能使用内联样式定义、内部代码

content="script-src 'unsafe-inline'; style-src 'unsafe-inline'"

您还必须显式地允许内联,bas64编码的图像:

content="img-src data:"

8.如何允许eval()

我相信很多人会说你不知道,因为“时代是邪恶的”,也是世界末日即将来临的最有可能的原因。那些人是错的。当然,你肯定可以用ava在网站的安全性上打大洞,但是它有完全有效的用例。你只需要聪明地使用它。你允许它这样:

content="script-src 'unsafe-eval'"

9“自我”到底是什么意思?

您可以将'self'理解为本地主机、本地文件系统或同一主机上的任何内容。这并不意味着这些。这意味着与定义内容策略的文件具有相同的方案(协议)、相同的主机和相同的端口的源。通过HTTP为您的站点提供服务?没有https,除非您明确定义它。

我在大多数示例中都使用了“self”,因为包含它通常是有意义的,但它绝不是强制性的。如果你不需要它,就把它删掉。

但是等一下!我不能只使用Content="default-src*"并完成它吗?

没有。除了明显的安全漏洞,这也不会像你预期的那样起作用。尽管一些医生声称它允许任何事情,但那不是真的。它不允许内联或evals,所以为了让你的网站变得更加脆弱,你可以使用这个:

content="default-src * 'unsafe-inline' 'unsafe-eval'"

... 但我相信你不会的。

进一步阅读:

http://content-security-policy.com

http://en.wikipedia.org/wiki/Content_Security_Policy

 类似资料:
  • CSP(内容安全策略) CSP(Content Security Policy) 即内容安全策略,主要目标是减少、并有效报告 XSS 攻击,其实质就是让开发者定制一份白名单,告诉浏览器允许加载、执行的外部资源。即使攻击者能够发现可从中注入脚本的漏洞,由于脚本不在白名单之列,浏览器也不会执行该脚本,从而达到了降低客户端遭受 XSS 攻击风险和影响的目的。 默认配置下,CSP 甚至不允许执行内联代码

  • 我想使用javascript访问一个网站。但我在控制台中遇到以下错误。 拒绝连接到'https://example.com'因为它违反了以下内容安全策略指令:“default src'self'”。请注意,未显式设置“connect src”,因此使用“default src”作为回退。 我在index.html中添加了以下meta标记, 元超文本传输协议-Equiv="内容-安全-策略"内容="

  • 问题内容: 我在开发人员控制台中收到很多错误: 拒绝评估字符串 拒绝执行内联脚本,因为它违反了以下内容安全策略指令 拒绝加载脚本 拒绝加载样式表 这是怎么回事?内容安全策略如何工作?如何使用HTTP标头? 具体来说,如何… …允许多个来源? …使用不同的指令? …使用多个指令? …处理端口? …处理不同的协议? …允许的协议? …使用内联样式,脚本和标签以及? …允许吗? 最后: 到底是什么意思?

  • 为了缓解大量潜在的跨站点脚本问题,Chrome 浏览器的扩展程序整合了内容安全策略(CSP)的一般概念。这引入了一些相当严格的策略,这些策略将使扩展默认情况下更加安全,并为您提供创建和执行规则的能力,以管理扩展和应用程序可以加载和执行的内容类型。 通常,CSP 充当扩展程序加载或执行资源的阻止/允许列表机制。为扩展程序定义合理的策略使您可以仔细考虑扩展程序所需的资源,并要求浏览器确保这些是扩展程序

  • 我试图在测试站点上使用新的内容安全策略(CSP)HTTP头。当我将CSP与Modernizer结合使用时,会出现CSP冲突错误。这是我正在使用的CSP策略: 内容安全策略:默认src“self”;脚本src'self'ajax.googleapis.com ajax.aspnetcdn.com;样式src‘self’;img src“自我”;字体src“self”;报表uri/WebResourc

  • 内容安全策略 CSP(Content Security Policy)即内容安全策略,主要目标是减少、并有效报告 XSS 攻击,其实质就是让开发者定制一份白名单,告诉浏览器允许加载、执行的外部资源。即使攻击者能够发现可从中注入脚本的漏洞,由于脚本不在白名单之列,浏览器也不会执行该脚本,从而降低客户端遭受 XSS 攻击风险。 默认配置下,CSP 甚至不允许执行内联代码 (<script> 块内容,内