Atributo Referer


1Presentación

Este atributo se usa para proteger el acceso a un controlador o una acción según el valor de la cabecera HTTP REFERER.


2Parámetros

El atributo ofrece varios parámetros:

  • $domain: (bool|string|array) Indica el dominio del referer (si es true, el dominio debe ser idéntico al dominio actual), o una lista de dominios (el referer debe ser igual a uno de ellos).
  • $domainSuffix: (string|array) Sufijo del dominio del referer, o lista de sufijos.
  • $domainRegex: (string) Expresión regular que debe validar el dominio del referer.
  • $domainVar: (string) Nombre de la variable de template que contiene el dominio con el que debe corresponder el dominio del referer.
  • $domainConfig: (bool) Pon el valor true para usar la clave refererDomain de la configuración extendida x-security (en el archivo etc/temma.php).
  • $https: (bool|string) El efecto de este parámetro depende de su valor:
    • null: (valor por defecto) El referer puede estar en HTTP o HTTPS.
    • true: El referer debe ser HTTPS.
    • false: El referer debe ser HTTP.
    • 'same': El referer debe usar el mismo protocolo (HTTP/HTTPS) que el sitio actual.
  • $path: (string|array) Ruta o lista de rutas del referer.
  • $pathPrefix: (string|array) Prefijo de ruta del referer, o lista de prefijos.
  • $pathSuffix: (string|array) Sufijo de ruta del referer, o lista de sufijos.
  • $pathRegex: (string) Expresión regular que debe validar la ruta del referer.
  • $pathVar: (string) Nombre de la variable de template que contiene la ruta del referer.
  • $pathConfig: (bool) Pon el valor true para usar la clave refererPath de la configuración extendida x-security (en el archivo etc/temma.php).
  • $url: (string|array) URL o lista de URLs del referer.
  • $urlRegex: (string) Expresión regular que debe validar la URL del referer.
  • $urlVar: (string) Nombre de la variable de template que contiene la URL del referer.
  • $urlConfig: (bool) Pon el valor true para usar la clave refererUrl de la configuración extendida x-security (en el archivo etc/temma.php).
  • $redirect: (string) URL a la que redirigir a los usuarios que no tienen derecho a acceder al controlador o la acción (en lugar de mostrar una página de error).
  • $redirectVar: (string) Nombre de la variable de template que contiene la URL a la que redirigir al usuario.

3Prioridad de redirección

Si se deniega el acceso, el usuario puede ser redirigido. Para determinar la URL de redirección, el atributo aplica el siguiente orden de prioridad:

  1. Si el parámetro $redirect está definido, se usa.
  2. Si el parámetro $redirectVar está definido, y contiene el nombre de una variable de template existente y no vacía, se usa su contenido.
  3. Si el archivo etc/temma.php contiene una configuración extendida x-security, y esta contiene una clave refererRedirect, se usa su contenido.
  4. Si el archivo etc/temma.php contiene una configuración extendida x-security, y esta contiene una clave redirect, se usa su contenido.

4Configuración

Para asegurarte de que todos los atributos Referer redirijan a la misma URL, basta con definir la clave refererRedirect en la configuración extendida x-security del archivo etc/temma.php:

<?php

return [
    'x-security' => [
        'refererRedirect' => '/failure'
    ]
];

Para asegurarte de que la URL de redirección sea la misma para los atributos Auth, Method, Referer y Redirect, basta con definir la clave redirect en la configuración extendida x-security del archivo etc/temma.php:

<?php

return [
    'x-security' => [
        'redirect' => '/login'
    ]
];

5Ejemplos

use \Temma\Attributes\Referer as TµReferer;

class Admin extends \Temma\Web\Controller {
    // acceso prohibido para peticiones sin referer
    #[TµReferer]
    public function action1() { }

    // autorizado solo para peticiones del mismo dominio
    #[TµReferer(true)]
    public function action2() { }

    // permitido para el dominio 'fubar.com'
    #[TµReferer('fubar.com')]
    public function action3() { }

    // igual que el anterior
    #[TµReferer(domain: 'fubar.com')]
    public function action3bis() { }

    // permitido para los dominios 'fubar.com' y 'www.fubar.com'
    #[TµReferer(['fubar.com', 'www.fubar.com'])]
    public function action4() { }

    // igual que el anterior
    #[TµReferer(domain: ['fubar.com', 'www.fubar.com'])]
    public function action4bis() { }

    // permitido para dominios terminados en '.fubar.com'.
    #[TµReferer(domainSuffix: '.fubar.com')]
    public function action5() { }

    // permitido para dominios terminados en '.fubar.com' o '.foobar.com'.
    #[TµReferer(domainSuffix: ['.fubar.com', '.foobar.com'])]
    public function action6() { }

    // permitido para dominios que validan la expresión regular proporcionada
    #[TµReferer(domainRegex: '/^test\d?.fubar.(com|net)$/')]
    public function action7() { }

    // autorizado para el dominio cuyo nombre está guardado en
    // la variable de template 'okDomain'
    #[TµReferer(domainVar: 'okDomain')]
    public function action8() { }

    // autorizado para el dominio definido en la clave 'refererDomain' de
    // la configuración extendida 'x-security' (en el archivo 'etc/temma.php')
    #[TµReferer(domainConfig: true)]
    public function action9() { }

    // autorizado para un referer HTTP
    #[TµReferer(https: false)]
    public function action10() { }

    // autorizado para un referer HTTPS
    #[TµReferer(https: true)]
    public function action11() { }

    // autorizado para un referer cuyo protocolo (HTTP/HTTPS)
    // sea el mismo que el del sitio actual
    #[TµReferer(https: 'same')]
    public function action12() { }

    // autorizado para un referer con la ruta '/fu/bar.html'.
    #[TµReferer(path: '/fu/bar.html')]
    public function action13() { }

    // permitido para un referer con la ruta '/fu.html' o '/bar.html'
    #[TµReferer(path: ['/fu.html', '/bar.html'])]
    public function action14() { }

    // permitido para un referer cuya ruta empieza con '/fu/'
    #[TµReferer(pathPrefix: '/fu/')]
    public function action15() { }

    // autorizado para un referer cuya ruta empieza con '/fu/' o '/bar/'
    #[TµReferer(pathPrefix: ['/fu/', '/bar/'])]
    public function action16() { }

    // permitido para un referer cuya ruta termina con '/api.xml'
    #[TµReferer(pathSuffix: '/api.xml')]
    public function action17() { }

    // autorizado para un referer cuya ruta termina con '/api.xml' o '/api.json'
    #[TµReferer(pathSuffix: ['/api.xml', '/api.json'])]
    public function action18() { }

    // autorizado para un referer cuya ruta valida la expresión regular proporcionada
    #[TµReferer(pathRegex: '/^\/.*testApi.*\.xml$/')]
    public function action19() { }

    // autorizado para un referer cuya ruta corresponde a la guardada
    // en la variable de template 'okPath'
    #[TµReferer(pathVar: 'okPath')]
    public function action20() { }

    // autorizado para un referer cuya ruta corresponde a la guardada
    // en la clave 'refererPath' de la configuración extendida 'x-security'
    // (en el archivo 'etc/temma.php')
    #[TµReferer(pathConfig: true)]
    public function action21() { }

    // autorizado para un referer cuya URL es 'https://www.fubar.com/some/page.html'
    #[TµReferer(url: 'https://www.fubar.com/some/page.html')]
    public function action22() { }

    // permitido para un referer cuya URL es 'https://fu.com/bar'
    // o 'https://bar.com/fu'
    #[TµReferer(url: ['https://fu.com/bar', 'https://bar.com/fu'])]
    public function action23() { }

    // autorizado para un referer cuya URL valida la expresión regular proporcionada
    #[TµReferer(urlRegex: '/^.*$/')]
    public function action24() { }

    // autorizado para un referer cuya URL coincide con la guardada en
    // la variable de template 'okURL'
    #[TµReferer(urlVar: 'okURL')]
    public function action25() { }

    // autorizado para un referer cuya URL coincide con la guardada en la
    // clave 'refererUrl' de la configuración extendida 'x-security'
    // (en el archivo 'etc/temma.php')
    #[TµReferer(urlConfig: true)]
    public function action26() { }

    // redirige a la URL definida si no hay referer
    #[TµReferer(redirect: '/login')]
    public function action27() { }

    // redirige a la URL definida en la variable de template 'redirRef'
    #[TµReferer(redirectVar: 'redirRef')]
    public function action28() { }

    // redirige a la URL guardada en la clave 'refererRedirect' de
    // la configuración extendida 'x-security' (en el archivo 'etc/temma.php')
    #[TµReferer]
    public function action29() { }
}