Empezando

Esta guía completa proporciona una descripción detallada de cómo comenzar con el Firewall de Shieldon para tu aplicación web. Desglosemos los pasos.

Requisitos del servidor

Antes de utilizar el Firewall de Shieldon, asegúrate de que tu servidor cumple con los siguientes requisitos:

  • PHP >= 7.1.0
  • Extensión PHP Ctype
  • Extensión PHP JSON
  • GD Extensión PHP (Requerida para generar imágenes de códigos de verificación de Captcha.)
  • Extensión PHP PDO (Requerido solo si deseas utilizar el controlador MySQL o SQLite)
  • Extensión PHP Redis (Requerido solo si deseas utilizar el controlador Redis)

Instalación

Shieldon se puede instalar mediante PHP Composer:

composer require shieldon/shieldon

Implementación

Existen tres formas principales de implementar Shieldon en tu aplicación:

  • Implementar Shieldon como un middleware PSR-15.
  • Implementar Shieldon en la etapa de inicio de tu aplicación.
  • Implementar Shieldon en un controlador padre del cual otros controladores heredan.

Cada método de implementación se acompaña de ejemplos prácticos utilizando frameworks populares como Slim 4, Laravel 6 y CodeIgniter 3.


Middleware PSR-15

Ejemplo: Framework Slim 4

Shieldon se puede utilizar como un middleware PSR-15, como se muestra en el ejemplo utilizando el framework Slim 4.

(1) Crea un middleware para el Firewall.

class FirewallMiddleware
{
    /**
     * Clase invocable del middleware de ejemplo
     *
     * @param ServerRequest  $request  Solicitud PSR-7
     * @param RequestHandler $handler  Controlador de solicitud PSR-15
     *
     * @return Response
     */
    public function __invoke(Request $request, RequestHandler $handler): Response
    {
        $response = $handler->handle($request);

        $firewall = new \Shieldon\Firewall\Firewall($request, $response);

        // El directorio donde el Firewall de Shieldon colocará sus archivos.
        $firewall->configure(__DIR__ . '/../cache/shieldon_firewall');
        $response = $firewall->run();

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

        return $response;
    }
}

(2) Agrega el middleware del Firewall en tu aplicación.

Por ejemplo, si estás utilizando el framework Slim 4, el código debería verse así:

$app->add(new FirewallMiddleware());

(3) Crea una ruta para el panel de control.

Por ejemplo, si estás utilizando el framework Slim 4, el código debería verse así. Luego puedes acceder a la URL https://tusitio.com/firewall/panel para iniciar sesión en el panel de control.

$app->any('/firewall/panel[/{params:.*}]', function (Request $request, Response $response, $args) {
    $firewall = new \Shieldon\Firewall\Firewall($request, $response);

    // El directorio donde el Firewall de Shieldon colocará sus archivos.
    // Debe ser el mismo que el middleware del Firewall.
    $firewall->configure(__DIR__ . '/../cache/shieldon_firewall');

    $panel = new \Shieldon\Firewall\Panel();

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

Nota:

  • Los métodos HTTP POST y GET deben aplicarse a tu sitio web.
  • Se requiere el método POST para resolver CAPTCHAs por parte de los usuarios que han sido bloqueados temporalmente.

Etapa de inicio

Ejemplo: Framework Laravel 6

Puedes inicializar Shieldon en la etapa de inicio de tu aplicación, como se muestra en el ejemplo utilizando el framework Laravel 6.

(1) Antes de inicializar $app

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

/*
|--------------------------------------------------------------------------
| Ejecutar el Firewall de Shieldon
|--------------------------------------------------------------------------
|
| El Firewall de Shieldon vigilará todas las solicitudes HTTP que lleguen a tu sitio web.
| Ejecutar el Firewall de Shieldon antes de inicializar Laravel evitará posibles
| conflictos con las funciones integradas 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);
    $response = $firewall->run();

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

(2) Define una ruta para el panel del Firewall.

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

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

    // El punto de entrada debe ser el mismo que la ruta definida.
    $panel->entry('/firewall/panel/');

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

Controlador principal

Ejemplo: Framework CodeIgniter 3

Shieldon también se puede implementar en un controlador principal que otros controladores heredan, como se muestra en el ejemplo utilizando el framework CodeIgniter 3.

  1. Crea un controlador principal.

Crea un nuevo archivo llamado MY_Controller.php en el directorio application/core/. Este será tu controlador principal.

Aquí está la estructura básica de MY_Controller:

class MY_Controller extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
    }
}
  1. Inicializa una instancia de Firewall

A continuación, inicializa el Firewall de Shieldon en el constructor de MY_Controller. Esto asegurará que el Firewall de Shieldon se inicialice para cada controlador que hereda de MY_Controller.

class MY_Controller extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();

        // Autocargador de Composer
        require_once APPPATH . '../vendor/autoload.php';

        // Este directorio debe tener permisos de escritura.
        $storage = APPPATH . 'cache/shieldon_firewall';

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

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

    /**
     * Protección del Firewall de Shieldon.
     */
    public function firewall()
    {
        $firewall = \Shieldon\Container::get('firewall');
        $firewall->run();
    }
}
  1. Define un controlador para el panel de control.

A continuación, debes definir un controlador para el panel de control del Firewall de Shieldon. En este ejemplo, crearás un controlador llamado Firewall.

Crea un nuevo archivo llamado Firewall.php en el directorio application/controllers/ y agrega el siguiente código:

class Firewall extends MY_Controller
{
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Este es el punto de entrada de nuestro panel de control del Firewall.
     */
    public function panel()
    {
        $panel = new \Shieldon\Firewall\Panel();
        $panel->entry('/firewall/panel/');
    }
}

Ahora, el Firewall de Shieldon se inicializa en tu MY_Controller y cada controlador que herede de MY_Controller y ejecute el método firewall tendrá acceso a él. Además, has definido un controlador Firewall con un método panel, que es tu punto de entrada para el panel de control del Firewall de Shieldon.

Inicio de sesión

Finalmente, independientemente del método de implementación elegido, al acceder a https://tusitio.com/firewall/panel/ se mostrará la página de inicio de sesión.

El nombre de usuario y la contraseña predeterminados son shieldon_user y shieldon_pass, respectivamente. Por motivos de seguridad, se recomienda cambiar las credenciales de inicio de sesión después del primer inicio de sesión.