Laravel

Esta guía le ayudará a implementar el Firewall de Shieldon en su aplicación Laravel. Los siguientes pasos han sido probados en Laravel 5 y 6.

Estos consejos no son la única forma de hacerlo, pero también le brindan algunas ideas.

Firewall en el Framework Laravel

Instalación

Use PHP Composer:

composer require shieldon/shieldon

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

  • shieldon/psr-http La implementación PSR-7, 15, 17 con documentación completa y pruebas exhaustivas.
  • shieldon/event-dispatcher El despachador de eventos más simple.
  • 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 API o servicios de terceros, como Telegram, Line, RocketChat, Slack, SendGrid, MailGun, y más.

Implementación

Puede utilizar Shieldon como un middleware o implementar Shieldon en la etapa de inicio de su aplicación web.

Etapa de Inicio

Inicialice Shieldon en la etapa de inicio de su aplicación, preferiblemente después de que se haya incluido el autoloader de Composer. De esta manera se evitan posibles conflictos con las funciones incorporadas de Laravel.

(1) Antes de inicializar $app

En su archivo bootstrap/app.php, después de <?php, agregue el siguiente código.

/*
|--------------------------------------------------------------------------
| Ejecutar el Firewall de Shieldon
|--------------------------------------------------------------------------
|
| El Firewall de Shieldon vigilará todas las solicitudes HTTP que lleguen a su sitio web.
| Ejecutar el Firewall de Shieldon antes de inicializar Laravel evitará posibles conflictos
| con las funciones incorporadas de Laravel.
*/
if (isset($_SERVER['REQUEST_URI'])) {

    // Este directorio debe tener permisos de escritura.
    // Lo colocamos en el directorio `storage/shieldon_firewall`.
    $storage =  __DIR__ . '/../storage/shieldon_firewall';

    $firewall = new \Shieldon\Firewall\Firewall();

    $firewall->configure($storage);

    // La URL base para el panel de control.
    $firewall->controlPanel('/firewall/panel/');

    $response = $firewall->run();

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

(2) Definir una Ruta para el Panel del Firewall

Agregue la siguiente ruta a su archivo routes/web.php:

Route::any('/firewall/panel/{path?}', function() {

    $panel = new \Shieldon\Firewall\Panel();
    $panel->csrf(['_token' => csrf_token()]);
    $panel->entry();

})->where('path', '(.*)');

Si adopta este método, el Firewall de Shieldon se ejecutará en el alcance global. Sin embargo, puede configurar una lista de exclusión para las URL que desea que el Firewall de Shieldon ignore.

Middleware

Puede definir un middleware por sí mismo o utilizar la clase de integración proporcionada.

Si elige utilizar la clase de integración, omita el paso 1 y vaya al paso 2-2.

1. Definir un Middleware

Ejecute el siguiente comando para crear un middleware llamado ShieldonFirewall:

php artisan make:middleware ShieldonFirewall

A continuación, actualice el método handle de la clase de middleware ShieldonFirewall con el siguiente código:

<?php

namespace App\Http\Middleware;

use Closure;

class ShieldonFirewall
{
    /**
     * Manejar una solicitud entrante.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $firewall = new \Shieldon\Firewall\Firewall();

        // El directorio en el que el Firewall de Shieldon colocará sus archivos.
        $storage = storage_path('shieldon_firewall');;

        $firewall->configure($storage);

        // URL base para el panel de control.
        $firewall->controlPanel('/firewall/panel/');

        $firewall->getKernel()->setCaptcha(
            new Csrf([
                'name' => '_token',
                'value' => csrf_token(),
            ])
        );

        $response = $firewall->run();

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

        return $next($request);
    }
}

2. Registrar el Alias del Middleware

Actualice el archivo app/Http/Kernel.php y agregue la siguiente línea a la propiedad $routeMiddleware:

Para el paso 2-1:

'firewall' => \App\Http\Middleware\ShieldonFirewall::class,

Para el paso 2-2 (utilizando la clase de integración):

Si utiliza la clase de integración, el código se verá así:

'firewall' => \Shieldon\Firewall\Integration\Laravel::class,

3. Definir una Ruta para el Panel del Firewall

Agregue la siguiente ruta a su archivo routes/web.php:

Route::any('/firewall/panel/{path?}', function() {

    $panel = new \Shieldon\Firewall\Panel();
    $panel->csrf(['_token' => csrf_token()]);
    $panel->entry();

})->where('path', '(.*)');

El Firewall de Shieldon comenzará a vigilar su sitio web si se habilita en la sección de configuración del Daemon. Asegúrese de haber configurado correctamente los ajustes.