Introduzione

Questa guida completa fornisce una panoramica dettagliata per iniziare con il Firewall di Shieldon per la tua applicazione web. Vediamolo passo dopo passo.

Requisiti del server

Prima di utilizzare il Firewall di Shieldon, assicurati che il tuo server soddisfi i seguenti requisiti:

  • PHP >= 7.1.0
  • Estensione PHP Ctype
  • Estensione PHP JSON
  • Estensione PHP GD (Necessaria per generare immagini di codici di verifica Captcha.)
  • Estensione PHP PDO (Richiesta solo se desideri utilizzare il driver MySQL o SQLite)
  • Estensione PHP Redis (Richiesta solo se desideri utilizzare il driver Redis)

Installazione

Shieldon può essere installato tramite Composer per PHP:

composer require shieldon/shieldon

Implementazione

Esistono tre principali modi per implementare Shieldon nella tua applicazione:

  • Implementare Shieldon come un middleware PSR-15.
  • Implementare Shieldon nella fase di bootstrap della tua applicazione.
  • Implementare Shieldon in un controller genitore da cui ereditano gli altri controller.

Ogni metodo di implementazione è accompagnato da esempi pratici utilizzando framework popolari come Slim 4, Laravel 6 e CodeIgniter 3.


Middleware PSR-15

Esempio: Framework Slim 4

Shieldon può essere utilizzato come un middleware PSR-15, come mostrato nell'esempio utilizzando il framework Slim 4.

(1) Crea un middleware per il firewall.

class FirewallMiddleware
{
    /**
     * Classe invocabile del middleware di esempio
     *
     * @param ServerRequest  $request  Richiesta PSR-7
     * @param RequestHandler $handler  Gestore delle richieste PSR-15
     *
     * @return Response
     */
    public function __invoke(Request $request, RequestHandler $handler): Response
    {
        $response = $handler->handle($request);

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

        // La directory in cui Shieldon Firewall posizionerà i suoi file.
        $firewall->configure(__DIR__ . '/../cache/shieldon_firewall');
        $response = $firewall->run();

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

        return $response;
    }
}

(2) Aggiungi il middleware del firewall nella tua applicazione.

Ad esempio, se stai utilizzando il framework Slim 4, il codice dovrebbe apparire come segue:

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

(3) Crea un percorso per il pannello di controllo.

Ad esempio, se stai utilizzando il framework Slim 4, il codice dovrebbe apparire come segue. Successivamente, puoi accedere all'URL https://iltuosito.com/firewall/panel per effettuare il login al pannello di controllo.

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

    // La directory in cui Shieldon Firewall posizionerà i suoi file.
    // Deve essere la stessa del firewallMiddleware.
    $firewall->configure(__DIR__ . '/../cache/shieldon_firewall');

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

    // L'URL di base per il pannello di controllo.
    $panel->entry('/firewall/panel/');
});

Nota:

  • I metodi HTTP POST e GET devono essere applicati al tuo sito web.
  • Il metodo POST è necessario per risolvere i CAPTCHA da parte degli utenti temporaneamente bloccati.

Fase di bootstrap

Esempio: Framework Laravel 6

Puoi inizializzare Shieldon nella fase di bootstrap della tua applicazione, come mostrato nell'esempio utilizzando il framework Laravel 6.

(1) Prima di inizializzare $app

Nel tuo file bootstrap/app.php, dopo <?php, aggiungi il seguente codice.

/*
|--------------------------------------------------------------------------
| Esegui il Firewall di Shieldon
|--------------------------------------------------------------------------
|
| Il Firewall di Shieldon monitorerà tutte le richieste HTTP che arrivano al tuo sito web.
| Eseguire il Firewall di Shieldon prima di inizializzare Laravel evita possibili
| conflitti con le funzioni integrate di Laravel.
*/
if (isset($_SERVER['REQUEST_URI'])) {

    // Questa directory deve essere scrivibile.
    // La posizioniamo nella directory `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) Definisci un percorso per il pannello di controllo del firewall.

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

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

    // Il punto di ingresso deve essere lo stesso della route definita.
    $panel->entry('/firewall/panel/');

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

Controller principale

Esempio: Framework CodeIgniter 3

Shieldon può anche essere implementato in un controller principale da cui gli altri controller ereditano, come mostrato nell'esempio utilizzando il framework CodeIgniter 3.

  1. Crea un controller principale.

Crea un nuovo file MY_Controller.php nella directory application/core/. Questo sarà il tuo controller principale.

Ecco la struttura di base di MY_Controller:

class MY_Controller extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
    }
}
  1. Inizializza un'istanza di Firewall

Successivamente, inizializza il Firewall di Shieldon nel costruttore di MY_Controller. In questo modo, il Firewall di Shieldon verrà inizializzato per ogni controller che eredita da MY_Controller.

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

        // Autoload di Composer
        require_once APPPATH . '../vendor/autoload.php';

        // Questa directory deve essere scrivibile.
        $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);
        }
    }

    /**
     * Protezione del Firewall di Shieldon.
     */
    public function firewall()
    {
        $firewall = \Shieldon\Container::get('firewall');
        $firewall->run();
    }
}
  1. Definisci un controller per il pannello di controllo.

Successivamente, devi definire un controller per il pannello di controllo del Firewall di Shieldon. In questo esempio, creerai un controller chiamato Firewall.

Crea un nuovo file Firewall.php nella directory application/controllers/ e aggiungi il seguente codice:

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

    /**
     * Questo è il punto di ingresso per il nostro pannello di controllo del Firewall.
     */
    public function panel()
    {
        $panel = new \Shieldon\Firewall\Panel();
        $panel->entry('/firewall/panel/');
    }
}

Ora, il Firewall di Shieldon viene inizializzato nel tuo MY_Controller, e ogni controller che eredita da MY_Controller ed esegue il metodo firewall vi accederà. Inoltre, hai definito un controller Firewall con un metodo panel, che rappresenta il punto di ingresso al pannello di controllo del Firewall di Shieldon.

Accesso

Infine, indipendentemente dal metodo di implementazione scelto, accedendo a https://iltuosito.com/firewall/panel/ verrà visualizzata la pagina di accesso.

Il nome utente e la password predefiniti sono shieldon_user e shieldon_pass, rispettivamente. Per motivi di sicurezza, si consiglia di modificare le credenziali di accesso dopo il primo accesso.