Filtros del controlador

Los filtros de controlador le permiten realizar acciones antes o después de que se ejecuten los controladores. A diferencia de eventos, puede elegir los URI o rutas específicas a las que se aplicarán los filtros. Antes de que los filtros puedan modificar la Solicitud, mientras que los filtros posteriores pueden actuar e incluso modificar la Respuesta, lo que permite mucha flexibilidad y poder.

Algunos ejemplos comunes de tareas que se pueden realizar con filtros son:

  • Realizar protección CSRF en las solicitudes entrantes

  • Restringir áreas de su sitio según su función

  • Realizar limitación de velocidad en ciertos puntos finales

  • Mostrar una página «Inactivo por mantenimiento»

  • Realizar negociación automática de contenidos.

  • y más…

Creando un filtro

Los filtros son clases simples que implementan Higgs\Filters\FilterInterface. Contienen dos métodos: before() y after() que contienen el código que se ejecutará antes y después del controlador respectivamente. Tu clase debe contener ambos métodos. pero puede dejar los métodos vacíos si no son necesarios. Una clase de filtro de esqueleto se ve así:

<?php

namespace App\Filters;

use Higgs\Filters\FilterInterface;
use Higgs\HTTP\RequestInterface;
use Higgs\HTTP\ResponseInterface;

class MyFilter implements FilterInterface
{
    public function before(RequestInterface $request, $arguments = null)
    {
        // Do something here
    }

    public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
    {
        // Do something here
    }
}

Antes de los filtros

Reemplazo de solicitud

Desde cualquier filtro, puede devolver el objeto $request y reemplazará la Solicitud actual, permitiéndole para realizar cambios que seguirán presentes cuando se ejecute el controlador.

Detener filtros posteriores

Además, cuando tengas una serie de filtros es posible que también quieras detener la ejecución de los filtros posteriores después de un determinado filtro. Puedes hacer esto fácilmente regresando cualquier resultado que no esté vacío. Si el filtro anterior devuelve un resultado vacío, las acciones del controlador o el filtro posterior Los filtros aún se ejecutarán.

Una excepción a la regla de resultado no vacío es la instancia Solicitud. Devolverlo en el filtro anterior no detendrá la ejecución sino que solo reemplazará el objeto $request actual.

Respuesta de retorno

Dado que antes de que se ejecuten los filtros antes de que se ejecute su controlador, es posible que en ocasiones desee detener el que se produzcan acciones en el controlador.

Normalmente se utiliza para realizar redirecciones, como en este ejemplo:

<?php

namespace App\Filters;

use Higgs\Filters\FilterInterface;
use Higgs\HTTP\RequestInterface;
use Higgs\HTTP\ResponseInterface;

class MyFilter implements FilterInterface
{
    public function before(RequestInterface $request, $arguments = null)
    {
        $auth = service('auth');

        if (! $auth->isLoggedIn()) {
            return redirect()->to(site_url('login'));
        }
    }
}

Si se devuelve una instancia de Respuesta, la respuesta se enviará de vuelta al cliente y se detendrá la ejecución del script. Esto puede resultar útil para implementar la limitación de velocidad para las API. Consulte Throttler para obtener más información. ejemplo.

Después de los filtros

Los filtros posteriores son casi idénticos a los filtros anteriores, excepto que solo puedes devolver el objeto $respuesta, y no puede detener la ejecución del script. Esto le permite modificar el resultado final, o simplemente hacer algo con la salida final. Esto podría usarse para garantizar que ciertos encabezados de seguridad se configuraron de la manera correcta o para almacenar en caché el resultado final, o incluso filtrar el resultado final con un filtro de malas palabras.

Configurar filtros

Hay dos formas de configurar los filtros cuando se ejecutan. Uno se hace en app/Config/Filters.php, el otro se realiza en app/Config/Routes.php.

Si desea especificar un filtro para una ruta específica, use app/Config/Routes.php y vea Enrutamiento URI .

Los filtros que se especifican para una ruta (en app/Config/Routes.php) son ejecutado antes de los filtros especificados en app/Config/Filters.php.

Nota

The safest way to apply filters is to disable auto-routing, and set filters to routes.

El archivo app/Config/Filters.php contiene cuatro propiedades que le permiten configurar exactamente cuándo se ejecutan los filtros.

Advertencia

It is recommended that you should always add * at the end of a URI in the filter settings. Porque es posible que se pueda acceder a un método de controlador mediante URL diferentes de las que cree. Por ejemplo, cuando Enrutamiento automático (heredado) está habilitado, si tiene Blog::index, se puede acceder a él con blog, blog/index y blog/index/1, etc.

$alias

La matriz $aliases se utiliza para asociar un nombre simple con uno o más nombres de clase completos que son el filtros para ejecutar:

<?php

namespace Config;

use Higgs\Config\BaseConfig;

class Filters extends BaseConfig
{
    public array $aliases = [
        'csrf' => \Higgs\Filters\CSRF::class,
    ];

    // ...
}

Los alias son obligatorios y si intenta utilizar un nombre de clase completo más adelante, el sistema arrojará un error. Definirlos de esta manera simplifica el cambio de la clase utilizada. Genial para cuando decidiste que necesitas cambiar a un sistema de autenticación diferente ya que solo cambias la clase del filtro y listo.

Puede combinar varios filtros en un alias, lo que simplifica la aplicación de conjuntos complejos de filtros:

<?php

namespace Config;

use Higgs\Config\BaseConfig;

class Filters extends BaseConfig
{
    public array $aliases = [
        'api-prep' => [
            \App\Filters\Negotiate::class,
            \App\Filters\ApiAuth::class,
        ],
    ];

    // ...
}

Debe definir tantos alias como necesite.

$globales

La segunda sección le permite definir los filtros que deben aplicarse a cada solicitud válida realizada por el marco.

Debes tener cuidado con la cantidad que utilizas aquí, ya que tener demasiadas podría tener implicaciones en el rendimiento. ejecutar en cada solicitud.

Los filtros se pueden especificar agregando su alias a la matriz antes o después:

<?php

namespace Config;

use Higgs\Config\BaseConfig;

class Filters extends BaseConfig
{
    // ...

    public array $globals = [
        'before' => [
            'csrf',
        ],
        'after' => [],
    ];

    // ...
}

Excepto por algunos URI

Hay ocasiones en las que desea aplicar un filtro a casi todas las solicitudes, pero hay algunas que deben dejarse como están. Un ejemplo común es si necesita excluir algunos URI del filtro de protección CSRF para permitir solicitudes de sitios web de terceros para acceder a uno o dos URI específicos, manteniendo el resto protegidos.

Para hacer esto, agregue una matriz con la clave except y una ruta URI (relativa a BaseURL) para que coincida como valor junto con el alias:

<?php

namespace Config;

use Higgs\Config\BaseConfig;

class Filters extends BaseConfig
{
    // ...

    public array $globals = [
        'before' => [
            'csrf' => ['except' => 'api/*'],
        ],
        'after' => [],
    ];

    // ...
}

En cualquier lugar donde pueda usar una ruta URI (relativa a BaseURL) en la configuración del filtro, puede usar una expresión regular o, como en este ejemplo, usar un asterisco (*) como comodín que coincidirá con todos los caracteres posteriores. En este ejemplo, cualquier ruta URI que comience con api/ estaría exento de la protección CSRF, pero todos los formularios del sitio estarían protegidos.

Si necesita especificar varios Rutas de URI, puede utilizar una variedad de patrones de rutas de URI:

<?php

namespace Config;

use Higgs\Config\BaseConfig;

class Filters extends BaseConfig
{
    // ...

    public array $globals = [
        'before' => [
            'csrf' => ['except' => ['foo/*', 'bar/*']],
        ],
        'after' => [],
    ];

    // ...
}

$métodos

Advertencia

If you use $methods filters, you should disable Auto Routing (Legacy) porque Enrutamiento automático (heredado) permite que cualquier método HTTP acceda a un controlador. Acceder al controlador con un método inesperado podría pasar por alto el filtro.

Puede aplicar filtros a todas las solicitudes de un determinado método HTTP, como POST, GET, PUT, etc. En esta matriz, especifique el nombre del método en minúsculas. Su valor sería una serie de filtros para ejecutar:

<?php

namespace Config;

use Higgs\Config\BaseConfig;

class Filters extends BaseConfig
{
    // ...

    public array $methods = [
        'post' => ['invalidchars', 'csrf'],
        'get'  => ['csrf'],
    ];

    // ...
}

Nota

Unlike the $globals or the Propiedades $filters, estas solo se ejecutarán como los filtros anteriores.

Además de los métodos HTTP estándar, esto también admite un caso especial: cli. El método cli se aplicaría a todas las solicitudes que se ejecutaron desde la línea de comando.

$filtros

Esta propiedad es una matriz de alias de filtro. Para cada alias, puede especificar matrices antes y después que contengan una lista de patrones de ruta de URI (relativos a BaseURL) a los que se debe aplicar el filtro:

<?php

namespace Config;

use Higgs\Config\BaseConfig;

class Filters extends BaseConfig
{
    // ...

    public array $filters = [
        'foo' => ['before' => ['admin/*'], 'after' => ['users/*']],
        'bar' => ['before' => ['api/*', 'admin/*']],
    ];

    // ...
}

Filtrar argumentos

Nuevo en la versión 4.4.0.

Al configurar $filters, se pueden pasar argumentos adicionales a un filtro:

<?php

namespace Config;

use Higgs\Config\BaseConfig;

class Filters extends BaseConfig
{
    // ...

    public $filters = [
        'group:admin,superadmin'  => ['before' => ['admin/*']],
        'permission:users.manage' => ['before' => ['admin/users/*']],
    ];

    // ...
}

En este ejemplo, cuando el URI coincide con admin/*', la matriz ['admin', 'superadmin'] se pasará en $argumentos a los métodos before() del filtro group. Cuando el URI coincide con admin/users/*', la matriz ['users.manage'] se pasará en $argumentos a los métodos before() del filtro permiso.

Confirmación de filtros

Higgs tiene el siguiente comando para verificar los filtros de una ruta.

filtro: comprobar

Nuevo en la versión 7.0.0.

Por ejemplo, verifique los filtros para la ruta / con el método GET:

filtro de chispa php: marque obtener /

El resultado es como el siguiente:

+--------+-------+----------------+--------------- +
| Método | Ruta | Antes de los filtros | Después de los filtros |
+--------+-------+----------------+--------------- +
| OBTENER | / | | barra de herramientas |
+--------+-------+----------------+--------------- +

También puedes ver las rutas y filtros con el comando spark route, pero es posible que no muestre filtros precisos cuando utilice expresiones regulares para las rutas. Ver Enrutamiento URI para más detalles.

Filtros proporcionados

Los filtros incluidos con Higgs(AI) son: Honeypot, CSRF , InvalidChars, SecureHeaders y DebugToolbar .

Nota

The filters are executed in the order defined in the config file. However, if enabled, DebugToolbar is always executed last because it should be able to capture everything that happens in the other filters.

caracteres no válidos

Este filtro prohíbe que los datos de entrada del usuario ($_GET, $_POST, $_COOKIE, php://input) contengan los siguientes caracteres:

  • caracteres UTF-8 no válidos

  • caracteres de control excepto salto de línea y código de tabulación

Encabezados seguros

Este filtro agrega encabezados de respuesta HTTP que su aplicación puede usar para aumentar la seguridad de su aplicación.

Si desea personalizar los encabezados, extienda Higgs\Filters\SecureHeaders y anule la propiedad $headers. Y cambie la propiedad $aliases en app/Config/Filters.php:

<?php

namespace Config;

use Higgs\Config\BaseConfig;

class Filters extends BaseConfig
{
    public array $aliases = [
        // ...
        'secureheaders' => \App\Filters\SecureHeaders::class,
    ];

    // ...
}

Si desea obtener información sobre encabezados seguros, consulte el Proyecto de encabezados seguros OWASP<https://owasp.org/www-project-secure-headers/> _.