silverstripe/security-extensions

一个临时填充库,用于安全改进,这些改进将被移植到核心

安装 187,654

依赖项: 3

建议者: 0

安全: 0

星星: 2

监视者: 8

分支: 3

开放性问题: 2

类型:silverstripe-vendormodule

4.5.2 2024-02-07 03:11 UTC

README

注意:此模块不再在Silverstripe CMS 5中提供商业支持,它不提供CMS5兼容版本。自Silverstripe CMS 5以来,它已成为核心功能的一部分。

CI

概述

此模块是某些安全相关功能的填充程序,这些功能将成为SilverStripe产品的核心部分,但在此期间需要支持较旧的Silverstripe 3.7和4.x。

此模块将不会与CMS 5兼容 - 相反,其功能已被合并回核心模块。

安装

$ composer require silverstripe/security-extensions 1.x-dev

功能

Sudo模式

Sudo模式代表了一种更高的权限级别,即您更有信心当前用户确实是已登录的账户的所有者。这是通过重新验证账户的密码是否正确来完成的,然后在一定时间内(可配置)保持有效,直到再次检查。

当用户登录CMS时,Sudo模式将自动启用配置的持续时间。请注意,如果PHP会话寿命在Sudo模式寿命之前到期,Sudo模式也将被清除(并在用户再次登录时重新启用)。如果用户长时间保持CMS开放,或继续使用它,并在此期间在后台自动刷新,Sudo模式最终将在达到最大寿命时失效。

配置寿命

默认的SudoModeServiceInterface实现是SudoModeService,其寿命可以通过YAML进行配置。您应使用SudoModeServiceInterface::getLifetime()读取寿命值。

SilverStripe\SecurityExtensions\Service\SudoModeService:
  lifetime_minutes: 25

为控制器启用Sudo模式

您可以将SilverStripe\SecurityExtensions\Services\SudoModeServiceInterface添加为依赖项,以控制器之一需要sudo模式的一个操作

class MyController extends Controller
{
    private $sudoModeService;

    private static $dependencies = ['SudoModeService' => '%$' . SudoModeServiceInterface::class];

    public function setSudoModeService(SudoModeServiceInterface $sudoModeService): self
    {
        $this->sudoModeService = $sudoModeService;
        return $this;
    }
}

在控制器操作中执行sudo模式验证检查只需使用服务来验证请求即可

public function myAction(HTTPRequest $request): HTTPResponse
{
    if (!$this->sudoModeService->check($request->getSession()) {
        return $this->httpError(403, 'Sudo mode is required for this action');
    }
    // ... continue with sensitive operations
}

在React组件中使用sudo模式

此模块定义了一个React Higher-Order-Component,可以将其应用于您的模块或代码中的React组件,以拦截组件渲染并显示“sudo模式要求”信息和登录屏幕,该屏幕将验证,激活sudo模式,并在成功后重新渲染包装组件。

注意:JavaScript注入器目前不支持注入转换/HOCs,因此我们将这些注入转换的应用耦合到本模块本身中,用于silverstripe/mfa模块。不幸的是,如果您想将其应用于自己的代码,您将需要将SudoMode HOC复制到您的项目或模块中,并在该点应用转换。

Sudo mode HOC example

示例实现

import WithSudoMode from '../containers/SudoMode/SudoMode';

Injector.transform('MyComponentWithSudoMode', (updater) => {
  updater.component('MyComponent', WithSudoMode);
});

添加到组件的要求

虽然 sudoModeActive 属性会自动从 Redux 配置存储中收集,但后端验证也已实施,以确保前端 UI 不能简单篡改以避免在敏感操作上重新验证。

同时确保您已保护您的端点免受 跨站请求伪造 (CSRF) 的攻击。

要求下次登录时更改密码

具有管理成员能力的管理员可以在 CMS 中查看一个复选框,位于设置成员密码的区域下。勾选此框将密码过期设置为当前日期,这意味着成员下次登录时将需要为他们的账户选择一个新密码。

为了不因每次更改无关设置并保存而不断更新该成员的记录,日期是选择性设置的。矩阵如下(- 表示没有更改)

在设置此字段且密码已过期用于审计目的时(管理员可以看到密码多久未过期),不进行任何更改。

类似地,在取消设置此字段且过期日期在未来时,也不进行任何更改 - 应保持原样 - 复选框是为了在 下一次 登录时立即要求选择新密码。

根据上述两段,在正常(CMS)使用中,不应可能遇到这些情况,因为 UI 在加载时会反映密码过期字段的当前状态。如果当前密码已过期,则复选框将被勾选。

版本控制

此库遵循 Semver。根据 Semver,您将能够升级到此库的任何次要或补丁版本,而不会对公共 API 进行任何破坏性更改。Semver 还要求我们明确定义此库的公共 API。

所有具有 public 可见性的方法都是公共 API 的一部分。所有其他方法都不是公共 API 的一部分。在可能的情况下,我们将尝试在次要/补丁版本中保持 protected 方法的向后兼容性,但如果您正在覆盖方法,请在升级前测试您的作品。

问题报告

请为任何您发现的错误或缺失的功能 创建一个问题

许可证

此模块是在 BSD 3-Clause License 下发布的。