drupal-composer/drupal-paranoia

Composer 插件,通过将所有 PHP 文件移动到 docroot 外部,提高基于 composer 的 Drupal 项目的安全性。

安装次数: 1,745,083

依赖项: 4

建议者: 0

安全性: 0

星标: 62

关注者: 12

分支: 7

开放问题: 4

类型:composer-plugin

1.1.1 2021-12-29 12:27 UTC

This package is auto-updated.

Last update: 2024-08-29 04:14:43 UTC


README

Packagist Downloads Testing

Drupal Paranoia

Composer 插件,通过将所有 PHP 文件移动到 docroot 外部,提高基于 composer 的 Drupal 网站的网站安全性。

为什么使用此插件?

Coder 的关键安全问题是一个很好的例子,考虑将 PHP 文件移出 docroot。

更多相关链接

需求

除了 Windows 之外,此插件应在具有 Composer 支持的环境上工作。您使用 Windows 吗?帮助我们

安装

确保您已创建一个基本的 drupal-composer/drupal-project 项目。

将当前 docroot 目录重命名为 /app

cd drupal-project-root
mv web app

使用以下值更新您的根包的 composer.json

"extra": {
    "drupal-paranoia": {
        "app-dir": "app",
        "web-dir": "web"
    },
    "installer-paths": {
        "app/core": ["type:drupal-core"],
        "app/libraries/{$name}": ["type:drupal-library"],
        "app/modules/contrib/{$name}": ["type:drupal-module"],
        "app/profiles/contrib/{$name}": ["type:drupal-profile"],
        "app/themes/contrib/{$name}": ["type:drupal-theme"],
        "drush/contrib/{$name}": ["type:drupal-drush"]
    }
}

解释

  • /app 文件夹:Drupal 完整安装。
  • /web 文件夹:将仅包含来自 /app 文件夹的资产文件和 PHP 桩文件(index.php、install.php 等)的符号链接。

使用 composer require ... 在您的项目上安装此插件。

composer require drupal-composer/drupal-paranoia:~1

完成!插件和新 docroot 已安装。

资产文件类型

资产文件从 /app 符号链接到 /web 文件夹。

默认资产文件类型由插件提供

robots.txt
.htaccess
*.css
*.eot
*.ico
*.gif
*.jpeg
*.jpg
*.js
*.map
*.otf
*.png
*.svg
*.ttf
*.woff
*.woff2

要扩展资产文件类型列表,您可以使用 asset-files 配置

"extra": {
    "drupal-paranoia": {
        "app-dir": "app",
        "web-dir": "web",
        "asset-files": [
            "somefile.txt",
            "*.md"
        ]
    },
    "..."
}

如果您需要修改列表,您可以使用 post-drupal-set-asset-file-types 事件

"scripts": {
    "post-drupal-set-asset-file-types": [
        "DrupalProject\\composer\\ScriptHandler::setAssetFileTypes"
    ],
    "..."
},
<?php

/**
 * @file
 * Contains \DrupalProject\composer\ScriptHandler.
 */

namespace DrupalProject\composer;

use DrupalComposer\DrupalParanoia\AssetFileTypesEvent;

class ScriptHandler {

  public static function setAssetFileTypes(AssetFileTypesEvent $event) {
    $asset_file_types = $event->getAssetFileTypes();
    // Do what you want with the asset file types.
    $event->setAssetFileTypes($asset_file_types);
  }

}

根据此插件的目的,以下文件类型是 不允许的,如果列出,则将被忽略

*.inc
*.install
*.module
*.phar
*.php
*.profile
*.theme

排除路径

使用 drupal-paranoia 选项排除,您可以提供不应符号链接或桩到 /web 文件夹的路径。默认情况下,插件不提供排除项。

"extra": {
    "drupal-paranoia": {
        "app-dir": "app",
        "web-dir": "web",
        "excludes": [
            "core/install.php",
            "sites/simpletest"
        ]
    },
    "..."
}

注意: 考虑排除 /install.php。当此 URL 公开时,存在安全问题,它可以用来创建网站上现有贡献模块的列表。您可以通过如上所述的插件或通过 .htaccess 规则来排除它。

Web 服务器 docroot

将您的 Web 服务器文档根配置更改为指向 /web 文件夹。

插件事件

在此插件执行过程中,它会触发以下命名事件

  • drupal-paranoia-post-command-run:在执行 drupal:paranoia 命令后发生。

事件订阅者示例

<?php

namespace MyVendor;

use Composer\Composer;
use Composer\EventDispatcher\EventSubscriberInterface;
use Composer\IO\IOInterface;
use Composer\Plugin\PluginInterface;
use DrupalComposer\DrupalParanoia\PluginEvents as DrupalParanoiaPluginEvents;

class MyClass implements PluginInterface, EventSubscriberInterface
{
    protected $composer;
    protected $io;

    public function activate(Composer $composer, IOInterface $io)
    {
        $this->composer = $composer;
        $this->io = $io;
    }

    public static function getSubscribedEvents()
    {
        return array(
            DrupalParanoiaPluginEvents::POST_COMMAND_RUN => 'postDrupalParanoiaCommand',
        );
    }

    public function postDrupalParanoiaCommand(CommandEvent $event) {
        // Add your custom action.
    }
}

本地开发

每次您通过 Composer 安装或更新 Drupal 包时,/web 文件夹都会被重新创建。

composer require drupal/devel:~1.0
> drupal-paranoia: docroot folder has been rebuilt.

当处理主题、CSS 和 JS 等时,可能需要手动重建文件夹以符号链接新资产。

composer drupal:paranoia

公共文件

此插件假定公共文件文件夹位于 app/sites/<site>/files,并且创建了符号链接 web/sites/<site>/files -> ../../../app/sites/<site>/files