silverstripeltd / silverstripe-csp
Silverstripe中CSP头模块。
Requires
- php: ^8.1
- silverstripe/cms: ^5
- silverstripe/framework: ^5
Requires (Dev)
README
使用CSP头和SRI标签使您的站点更加安全。
该模块目前不受支持,它将频繁更改并破坏API。
要求
- SilverStripe ^5 (4.11+ 在之前的标签中可用)
安装
首先安装它,然后配置它。就像乐高一样!
composer require silverstripeltd/silverstripe-csp
文档
首先,您需要创建一个策略,您可能会从基本策略开始,这是一个很好的起点。
这看起来可能像这样
class ContentSecurityPolicy extends Basic { public function configure(): void { parent::configure(); } }
然后您可以从片段开始添加。这些是类似于服务CSP的小段代码。例如YouTube的是
class YouTube implements Fragment { public static function addTo(Policy $policy): void { $policy ->addDirective(Directive::SCRIPT, [ 'www.youtube.com', 's.ytimg.com', ]) ->addDirective(Directive::FRAME, "*.youtube.com"); } }
如果您需要添加新的片段或更新现有的片段,请向仓库提交拉取请求。您要么发现了我们所有使用此模块的项目的一个潜在问题,要么添加了一个其他项目可以从中受益的新服务
在策略中添加片段看起来像这样(在上面的配置函数中)
public function configure(): void { parent::configure(); $this->addFragments([YouTube::class]); }
通常您会定义private const FRAGMENTS = []
并在其中添加它们,这样在开始时就可以清楚地看到您添加了哪些片段。
要设置报告到URL,我们通常使用一个名为CSP_REPORT_TO
的环境变量。有效期也可以使用CSP_REPORT_TO_TTL
设置,这告诉浏览器应该记住URL多长时间。
如果需要,您可以在策略的配置函数中调用$this->reportTo()
。
如果需要,可以将报告发送到多个URL,CSP_REPORT_TO
支持CSV,或者可以使用数组使用指令。
要将策略添加到应用策略列表中,您需要在yaml配置中添加一些内容
Silverstripe\CSP\CSPMiddleware: policies: - 'Silverstripe\CSP\Policies\CMS' - 'App\ContentSecurityPolicy'
在上面的配置中,我们将其添加到默认包含的CMS策略之后进行检查。
要使策略仅报告,您可以添加环境变量CSP_REPORT_ONLY='enabled'
或在策略中编写代码,例如
public function configure(): void { parent::configure(); if (Director::isDev()) { $this->reportOnly(); } }
Google Tag Manager / Adservices 白名单
Google使用本地化区域域名来为访客加载图像跟踪器,这可能会在您的报告工具中累积大量违反报告的记录,如google.com|.co.nz|.com.au
等。为了解决此问题,而不是指定Google列出的所有支持域名(见https://www.google.com/supported_domains),可以为GTM片段设置白名单配置,以便在img-src
指令中允许所有https:
URL,例如
Silverstripe\CSP\Fragments\GoogleTagManager: whitelist_google_regional_domains: true
有关https图像的基本覆盖,请参阅ImagesOverHTTPs::class。
SRI
我们还在本模块中支持SRI,您可以通过yaml启用此功能
Silverstripe\CSP\CSPMiddleware: sri_enabled: true
这将向通过需求添加的资源添加SRI散列。它不会对通过insertHeadTags
添加的资源执行此操作。它也不会为动态创建的文件创建此内容(例如tinymce文件)
我们不会为外部资源添加SRI散列,如果需要,则应在获得外部资源提供的这些散列后自行添加它们(我们不会这样做,因为我们无法控制它们何时以及如何重新计算)
dev/build 将清除 SRI 记录(我们保留这些记录是为了确保我们不会针对每个请求生成它们)。这是通过 DevBuildExtension
添加的。
待办事项列表
- 添加对内联脚本的哈希处理功能(这将位于
CSPBackend
中) - 添加 Google 分析和标签管理器(这将很快完成)
- 添加单元测试
维护者
- Adrian adrhumphreys@gmail.com
问题跟踪器
问题在该存储库的问题部分进行跟踪。在提交问题之前,请先阅读现有的问题以确保您的问题独特。
如果问题看起来像是一个新的错误
- 创建一个新的问题
- 描述重现您问题的步骤以及预期的结果。单元测试、截图和屏幕录像在这里可能有所帮助。
- 尽可能详细地描述您的环境:SilverStripe 版本、浏览器、PHP 版本、操作系统、安装的任何 SilverStripe 模块。
请直接向模块维护者报告安全问题。请不要在问题跟踪器中提交安全问题。
开发和贡献
如果您想为该模块做出贡献,请确保您发起了一个拉取请求,并与模块维护者进行了讨论。
许可
请参阅 许可