Zend

El framework Zend ofrece oficialmente dos tipos de esqueletos: Zend MVC y Zend Expressive.

No importa qué esqueleto estés utilizando, esta guía te dará algunas ideas sobre cómo implementar el Firewall de Shieldon. Ten en cuenta que no estoy seguro de cuál es el mejor enfoque considerado en Zend, así que puedes elegir el método que prefieras.

Firewall en Zend Framework

Instalación

Utiliza PHP Composer:

composer require shieldon/shieldon

Esto también instalará las dependencias necesarias para Shieldon:

  • shieldon/psr-http La implementación de PSR-7, 15, 17 con documentación completa y pruebas extensas.
  • shieldon/event-dispatcher El despachador de eventos más sencillo.
  • shieldon/web-security Una colección de funciones relacionadas con la seguridad web.
  • shieldon/messenger Una colección de módulos para enviar mensajes a APIs o servicios de terceros, como Telegram, Line, RocketChat, Slack, SendGrid, MailGun, y más.

Implementación

Zend Expressive

Este es un ejemplo que muestra cómo utilizar un middleware PSR-15 en el esqueleto Zend Expressive.

1. Registrar un middleware.

Ya existe una clase de integración lista para Zend Expressive.

En tu pipeline.php, añade esta línea:

Ejemplo:

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

2. Definir un controlador

Ve al directorio App/src/Handler y crea un archivo PHP llamado FirewallPanelHandler.

Copia el siguiente texto y pégalo en ese archivo.

Ejemplo:

<?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;

/**
 * Controlador del Panel del Firewall
 * Si tienes CSRF habilitado, asegúrate de pasar el token CSRF al panel de control.
 */
class FirewallPanelHandler implements RequestHandlerInterface
{
    public function handle(ServerRequestInterface $request): ResponseInterface
    {
        $panel = new \Shieldon\Firewall\Panel();
        $panel->entry();

        return new Response();
    }
}

3. Definir una ruta para el Panel del Firewall

En tu route.php, añade esta línea:

Ejemplo:


// Inicio - Shieldon Firewall

$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']);
}

// Fin - Shieldon Firewall

Eso es todo.

Zend MVC

No estoy seguro de qué versión del framework Zend estás utilizando, así que proporcionaré instrucciones que funcionan con la mayoría de las versiones de Zend.

1. Antes de inicializar el núcleo

En tu public/index.php, debajo de esta línea:

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

Agrega el siguiente código:

/*
|--------------------------------------------------------------------------
| Ejecutar el Firewall de Shieldon
|--------------------------------------------------------------------------
|
| El Firewall de Shieldon supervisará todas las peticiones HTTP que lleguen a tu sitio web.
|
*/
if (isset($_SERVER['REQUEST_URI'])) {

    // Este directorio debe tener permisos de escritura.
    $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);
    }
}

El siguiente paso es crear un controlador para el panel de control.

2. Definir un controlador

Crea un controlador llamado FirewallController.

<?php

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;

class FirewallController extends AbstractActionController
{
    /**
     * El punto de entrada del Panel del Firewall.
     */
    public function panelAction()
    {
        $panel = new \Shieldon\Firewall\Panel();
        $panel->entry();
    }
}

3. Definir una ruta para el Panel del Firewall

Abre el archivo module.config.php ubicado en:

module/Application/config/module.config.php

(3-1) Dentro del array ['router']['routes'], agrega el siguiente código:

Ejemplo:

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

(3-2) Dentro del array ['controllers']['factories'], agrega el siguiente código:

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

Eso es todo.

Panel de Control

Puedes acceder al Panel del Firewall visitando /firewall/panel/. Para ver la página, ingresa a esta URL en tu navegador.

https://yourwebsite.com/firewall/panel

El inicio de sesión predeterminado es shieldon_user, y la contraseña es shieldon_pass. Después de iniciar sesión en el Panel del Firewall, lo primero que debes hacer es cambiar el inicio de sesión y la contraseña.

Si el Firewall de Shieldon está habilitado en la sección de configuración del Daemon, comenzará a monitorear tu sitio web. Asegúrate de haber configurado correctamente los ajustes.