Zend

Zend 框架官方提供了兩種類型的模板:Zend MVC 和 Zend Expressive。

無論您使用哪種模板,本指南都可以為您在 Zend 應用程式中實作 Shieldon 防火牆提供一些想法。請注意,我不確定哪一種方法被認為是最佳實踐,因此您可以選擇您偏好的方法。

Zend 框架中的防火牆

安裝

使用 PHP Composer:

composer require shieldon/shieldon

這也會安裝 Shieldon 所需的相依套件:

實作

Zend Expressive

這是一個在 Zend Expressive 模板中使用 PSR-15 Middleware 的範例。

1. 註冊 Middleware。

已經有一個 整合類別 可供 Zend Expressive 使用。

在您的 pipeline.php 中,新增以下程式碼:

範例:

$app->pipe(\Shieldon\Firewall\Integration\ZendPsr15:class);

2. 定義處理器

前往 App/src/Handler 目錄並建立一個名為 FirewallPanelHandler 的 PHP 檔案。

將下面的文字複製並貼到該檔案中。

範例:

<?php

declare(strict_types=1);

namespace App\Handler;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Zend\Diactoros\Response;

/**
 * 防火牆控制台處理器
 * 如果啟用 CSRF,請確保將 csrf token 傳遞給控制台。
 */
class FirewallPanelHandler implements RequestHandlerInterface
{
    public function handle(ServerRequestInterface $request): ResponseInterface
    {
        $panel = new \Shieldon\Firewall\Panel();
        $panel->entry();

        return new Response();
    }
}

3. 定義防火牆控制台的路由

在您的 route.php 中,新增以下程式碼:

範例:


// 開始 - Shieldon 防火牆

$app->route('/firewall/panel/', App\Handler\FirewallPanelHandler::class, ['GET', 'POST']);

foreach(\Shieldon\Firewall\Panel::getRoutes() as $route) {
    $app->route("/firewall/panel/$route/", App\Handler\FirewallPanelHandler::class, ['GET', 'POST']);
}

// 結束 - Shieldon 防火牆

就是這樣。

Zend MVC

我不確定您正在使用 Zend 框架的哪個版本,因此我將提供適用於大多數 Zend 版本的指示。

1. 在初始化 Core 之前

在您的 public/index.php 檔案中,在這行程式碼之下:

include __DIR__ . '/../vendor/autoload.php';

加入以下程式碼:

/*
|--------------------------------------------------------------------------
| 執行 Shieldon 防火牆
|--------------------------------------------------------------------------
|
| Shieldon 防火牆將監視所有傳入您網站的 HTTP 要求。
|
*/
if (isset($_SERVER['REQUEST_URI'])) {

    // 這個目錄必須可寫入。
    $storage = dirname($_SERVER['SCRIPT_FILENAME']) . '/../shieldon_firewall';

    $firewall = new \Shieldon\Firewall\Firewall();
    $firewall->configure($storage);
    $firewall->controlPanel('/firewall/panel');
    $response = $firewall->run();

    if ($response->getStatusCode() !== 200) {
        $httpResolver = new \Shieldon\Firewall\HttpResolver();
        $httpResolver($response);
    }
}

接下來是為控制台建立一個控制器。

2. 定義控制器

讓我們建立一個名為 FirewallController 的控制器。

<?php

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;

class FirewallController extends AbstractActionController
{
    /**
     * 防火牆控制台的進入點。
     */
    public function panelAction()
    {
        $panel = new \Shieldon\Firewall\Panel();
        $panel->entry();
    }
}

3. 定義防火牆控制台的路由

打開以下位置的 module.config.php 檔案:

module/Application/config/module.config.php

(3-1)['router']['routes'] 陣列內,新增以下程式碼:

範例:

'firewallpanel' => [
    'type' => Segment::class,
    'options' => [
        'route'    => '/firewall/panel[:slug]',
        'constraints' => [
            'slug' => '[a-zA-Z0-9\/]*',
        ],
        'defaults' => [
            'controller' => Controller\FirewallController::class,
            'action'     => 'panel',
        ],
    ],
],

(3-2)['controllers']['factories'] 陣列內,新增以下程式碼:

Controller\FirewallController::class => InvokableFactory::class,

就是這樣。

控制台

您可以透過在瀏覽器中訪問 /firewall/panel/ 存取防火牆控制台,以查看頁面。

https://yourwebsite.com/firewall/panel

預設登入帳號為 shieldon_user,密碼為 shieldon_pass。登入防火牆控制台後,您應該立即更改登入帳號和密碼。

如果在「Daemon」設定部分啟用了 Shieldon 防火牆,它將開始監控您的網站。請確保已正確設定好這些設定。