mazedlx/laravel-feature-policy

为 Laravel 应用程序的响应添加 Feature-Policy 标头

v2.2 2024-03-06 09:19 UTC

README

Latest Version on Packagist Tests Analyse and format Total Downloads

Permissions-Policy,之前被称为 Feature-Policy。但自从它脱离草案,已被重命名为 "Permissions-Policy"。
"Permissions-Policy" 是一个 HTTP 标头,可以用来限制浏览器的功能。

与 Content-Security-Policy 侧重于安全不同,"Permissions-Policy" 侧重于允许或禁用浏览器的功能。
这可以通过本包关注的 HTTP 标头来实现,但也可以通过在 iframe 元素上使用 allows 属性来实现。

iframe 示例
<iframe width="643" height="360" frameborder="0" allow="autoplay; fullscreen" allowfullscreen></iframe>

有关此标头的更多内容,可以在以下网站上找到。

安装

Laravel 10 用户应使用 v2.0 或更高版本,否则请坚持使用 v1.3

可以通过 composer 安装此包

$ composer require mazedlx/laravel-feature-policy

之后需要发布配置文件

$ php artisan vendor:publish --provider="Mazedlx\FeaturePolicy\FeaturePolicyServiceProvider" --tag="config"

它看起来像这样

配置文件
<?php

return [
    /*
     * A policy will determine which "Permissions-Policy" headers will be set.
     * A valid policy extends `Mazedlx\FeaturePolicy\Policies\Policy`
     */
    'policy' => Mazedlx\FeaturePolicy\Policies\Basic::class,

    /*
     * "Feature-Policy" headers will only be added if this is set to true
     */
    'enabled' => env('FPH_ENABLED', true),
];

中间件

您可以通过在 HTTP 内核中注册 Mazedlx\FeaturePolicy\AddFeaturePolicyHeaders::class 来将 "Feature-Policy" 标头添加到所有响应中

中间件示例
// app/Http/Kernel.php

...

protected $middlewareGroups = [
    'web' => [
        ...
        \Mazedlx\FeaturePolicy\AddFeaturePolicyHeaders::class,
    ]
];

或者您可以将中间件添加到单个路由和路由组

路由示例
// in a routes file
use App\Http\Controllers\HomeController;
use Mazedlx\FeaturePolicy\AddFeaturePolicyHeaders;

Route::get('/home', HomeController::class)
    ->middleware(AddFeaturePolicyHeaders::class);

您甚至可以将策略作为参数传递并覆盖配置文件中指定的策略

// in a routes file
use App\Http\Controllers\HomeController;
use Mazedlx\FeaturePolicy\AddFeaturePolicyHeaders;

Route::get('/home', HomeController::class)
    ->middleware(AddFeaturePolicyHeaders::class . ':' . MyFeaturePolicy::class);

用法

此包允许您配置最终会出现在 "Permissions-Policy" 标头中的策略。

此策略确定将在响应的 "Permissions-Policy" 标头中设置的指令。

它使用以下语法;

Feature-Policy: <directive> <allowlist>

"Permissions-Policy" 指令的一个示例是 microphone

Permissions-Policy: microphone=(self "https://spatie.be")

在上面的示例中,通过指定 microphone 并允许其对于 self,使得除了我们的站点和 https://spatie.be 之外的所有来源都禁用了此权限。

当前指令列表可以在以下位置找到:这里。其中一些指令包括

  • accelerometer
  • ambient-light-sensor
  • autoplay
  • camera
  • encrypted-media
  • fullscreen
  • geolocation
  • gyroscope
  • magnetometer
  • microphone
  • midi
  • payment
  • picture-in-picture
  • speaker
  • usb
  • vr

您可以将多个策略选项作为数组或作为用空格分隔的单个字符串添加

// in a policy
...
    ->addDirective(Directive::CAMERA, [
        Value::SELF,
        'spatie.be',
    ])
    ->addDirective(Directive::GYROSCOPE, 'self spatie.be')
...

创建策略

默认情况下,feature-policy 配置文件的 policy 键设置为 Mazedlx\FeaturePolicy\Policies\Basic::class,这允许您的站点使用一些可用的功能。该类看起来像这样

基本策略
<?php

namespace Mazedlx\FeaturePolicy\Policies;

use Mazedlx\FeaturePolicy\Value;
use Mazedlx\FeaturePolicy\Directive;

class Basic extends Policy
{
    public function configure()
    {
        $this->addDirective(Directive::GEOLOCATION, Value::SELF)
            ->addDirective(Directive::FULLSCREEN, Value::SELF);
    }
}

假设您对允许 geolocationfullscreen 满意,但还想添加 www.awesomesite.com 以获取对这些功能的访问权限,那么您可以轻松扩展此类

MyFeature 策略
<?php

namespace App\Services\FeaturePolicy\Policies;

use Mazedlx\FeaturePolicy\Directive;
use Mazedlx\FeaturePolicy\Policies\Basic;

class MyFeaturePolicy extends Basic
{
    public function configure()
    {
        parent::configure();

        $this->addDirective(Directive::GEOLOCATION, 'www.awesomesite.com')
            ->addDirective(Directive::FULLSCREEN, 'www.awesomesite.com');
    }
}

别忘了将 feature-policy 配置文件中的 policy 键更改为您的策略类的名称(例如 App\Services\Policies\MyFeaturePolicy)。

测试

您可以使用以下命令运行所有测试

$ composer test

变更日志

请参阅 CHANGELOG 了解最近发生了哪些变化。

贡献

请参阅 CONTRIBUTING 以获取详细信息。

贡献者

contrib.rocks 制作。

安全

如果您发现任何与安全相关的问题,请通过电子邮件 mazedlx@gmail.com 而不是使用问题跟踪器。

致谢

本软件包深受 Spatie laravel-csp 软件包的启发。感谢 Freek van der Herten 和 Thomas Verhelst 创建如此出色的软件包并承担所有繁重的工作!

支持

如果您喜欢这个软件包,请随时为其点赞。

许可

MIT 许可证 (MIT)。请参阅 LICENSE 以获取更多信息。