Attribut Referer


1Présentation

L'attribut Referer sert à protéger l'accès à un contrôleur ou une action en fonction de la valeur de l'en-tête HTTP REFERER.


2Paramètres

L'attribut propose plusieurs paramètres :

  • $domain : (bool|string|array) Indique le domaine du referer (si true, le domaine doit être identique au domaine courant), ou une liste de domaine (le referer doit être égal à l'un d'eux).
  • $domainSuffix : (string|array) Suffixe du domaine du referer, ou liste de suffixes.
  • $domainRegex : (string) Expression regulière que doit valider le domaine du referer.
  • $domainVar : (string) Nom de la variable de template contenant le domaine auquel doit correspondre le domaine du referer.
  • $domainConfig : (bool) Mettre à true pour utiliser la clé refererDomain de la configuration étendue x-security (dans le fichier etc/temma.php).
  • $https : (bool|string) L'effet de ce paramètre dépend de sa valeur :
    • null : (valeur par défaut) Le referer peut être en HTTP ou HTTPS.
    • true : Le referer doit être en HTTPS.
    • false : Le referer doit être en HTTP.
    • 'same' : Le referer doit utiliser le même protocole (HTTP/HTTPS) que le site courant.
  • $path : (string|array) Chemin d'URL ou liste de chemins d'URL du referer.
  • $pathPrefix : (string|array) Préfix de chemin d'URL du referer, ou liste de préfixes.
  • $pathSuffix : (string|array) Suffix de chemin d'URL du referer, ou liste de suffixes.
  • $pathRegex : (string) Expression regulière que doit valider le chemin d'URL du referer.
  • $pathVar : (string) Nom de la variable de template contenant le chemin d'URL du referer.
  • $pathConfig : (bool) Mettre à true pour utiliser la clé refererPath de la configuration étendue x-security (dans le fichier etc/temma.php).
  • $url : (string|array) URL ou liste d'URL du referer.
  • $urlRegex : (string) Expression regulière que doit valider l'URL du referer.
  • $urlVar : (string) Nom de la variable de template contenant l'URL du referer.
  • $urlConfig : (bool) Mettre à true pour utiliser la clé refererUrl de la configuration étendue x-security (dans le fichier etc/temma.php).
  • $redirect : (string) URL vers laquelle rediriger l'utilisateur s'il n'a pas le droit d'accéder au contrôleur ou à l'action (au lieu d'afficher une page d'erreur).
  • $redirectVar : (string) Nom de la variable de template contenant l'URL vers laquelle rediriger l'utilisateur.

3Priorité de redirection

Si l'accès est refusé, l'utilisateur peut être redirigé. Pour déterminer l'URL de redirection, l'attribut applique l'ordre de priorité suivant :

  1. Si le paramètre $redirect est défini, il est utilisé.
  2. Si le paramètre $redirectVar est défini, et qu'il contient le nom d'une variable de template qui existe et est non vide, le contenu de celle-ci est utilisé.
  3. Si le fichier etc/temma.php contient une configuration étendue x-security, et que celle-ci contient une clé refererRedirect, le contenu de celle-ci est utilisé.
  4. Si le fichier etc/temma.php contient une configuration étendue x-security, et que celle-ci contient une clé redirect, le contenu de celle-ci est utilisé.

4Configuration

Pour que tous les attributs Referer redirigent vers la même URL, il suffit de définir la clé refererRedirect dans la configuration étendue x-security du fichier etc/temma.php :

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

Pour que l'URL de redirection soit la même pour les attributs Auth, Method, Referer et Redirect, il suffit de définir la clé redirect dans la configuration étendue x-security du fichier etc/temma.php :

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

5Exemples

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

class Admin extends \Temma\Web\Controller {
    // accès interdit pour les requêtes sans referer
    #[TµReferer]
    public function action1() { }

    // autorisé pour les requêtes venant du même domaine uniquement
    #[TµReferer(true)]
    public function action2() { }

    // autorisé pour le domaine 'fubar.com'
    #[TµReferer('fubar.com')]
    public function action3() { }

    // identique au précédent
    #[TµReferer(domain: 'fubar.com')]
    public function action3bis() { }

    // autorisé pour les domaines 'fubar.com' et 'www.fubar.com'
    #[TµReferer(['fubar.com', 'www.fubar.com'])]
    public function action4() { }

    // identique au précédent
    #[TµReferer(domain: ['fubar.com', 'www.fubar.com'])]
    public function action4bis() { }

    // autorisé pour les domaines qui se terminent par '.fubar.com'
    #[TµReferer(domainSuffix: '.fubar.com')]
    public function action5() { }

    // autorisé pour les domaines qui se terminent par '.fubar.com' ou '.foobar.com'
    #[TµReferer(domainSuffix: ['.fubar.com', '.foobar.com'])]
    public function action6() { }

    // autorisé pour les domaines qui valident l'expression régulière fournie
    #[TµReferer(domainRegex: '^test\d?.fubar.(com|net)$')]
    public function action7() { }

    // autorisé pour le domaine dont le nom est stocké dans
    // la variable de template 'okDomain'
    #[TµReferer(domainVar: 'okDomain')]
    public function action8() { }

    // autorisé pour le domaine défini dans la clé 'refererDomain' de la
    // configuration étendue 'x-security' (dans le fichier 'etc/temma.php')
    #[TµReferer(domainConfig: true)]
    public function action9() { }

    // autorisé pour un referer qui était en HTTP
    #[TµReferer(https: false)]
    public function action10() { }

    // autorisé pour un referer qui était en HTTPS
    #[TµReferer(https: true)]
    public function action11() { }

    // autorisé pour un referer dont le protocole (HTTP/HTTPS) est le même
    // que le site courant
    #[TµReferer(https: 'same')]
    public function action12() { }

    // autorisé pour un referer avec un chemin d'URL '/fu/bar.html'
    #[TµReferer(path: '/fu/var.html')]
    public function action13() { }

    // autorisé pour un referer avec un chemin d'URL '/fu.html' ou '/bar.html'
    #[TµReferer(path: ['/fu.html', '/bar.html'])]
    public function action14() { }

    // autorisé pour un referer dont le chemin d'URL commence par '/fu/'
    #[TµReferer(pathPrefix: '/fu/')]
    public function action15() { }

    // autorisé pour un referer dont le chemin d'URL commence par '/fu/' ou '/bar/'
    #[TµReferer(pathPrefix: ['/fu/', '/bar/'])]
    public function action16() { }

    // autorisé pour un referer dont le chemin d'URL se termine par '/api.xml'
    #[TµReferer(pathSuffix: '/api.xml')]
    public function action17() { }

    // autorisé pour un referer dont le chemin d'URL se termine par '/api.xml' ou '/api.json'
    #[TµReferer(pathSuffix: ['/api.xml', '/api.json'])]
    public function action18() { }

    // autorisé pour un referer dont le chemin d'URL valide l'expression régulière fournie
    #[TµReferer(pathRegex: '/^\/.*testApi.*\.xml$/')]
    public function action19() { }

    // autorisé pour un referer dont le chemin d'URL correspond à celle stockée
    // dans la variable de template 'okPath'
    #[TµReferer(pathVar: 'okPath')]
    public function action20() { }

    // autorisé pour un referer dont le chemin d'URL correspond à celui stockée dans
    // la clé 'refererPath' de la configuration étendue 'x-security'
    // (dans le fichier 'etc/temma.php')
    #[TµReferer(pathConfig: true)]
    public function action21() { }

    // autorisé pour un referer dont l'URL est 'https://www.fubar.com/some/page.html'
    #[TµReferer(url: 'https://www.fubar.com/some/page.html')]
    public function action22() { }

    // autorisé pour un referer dont l'URL est 'https://fu.com/bar'
    // ou 'https://bar.com/fu'
    #[TµReferer(url: ['https://fu.com/bar', 'https://bar.com/fu'])]
    public function action23() { }

    // autorisé pour un referer dont l'URL valide l'expression régulière fournie
    #[TµReferer(urlRegex: '/^.*$/')]
    public function action24() { }

    // autorisé pour un referer dont l'URL correspond à celle stockée dans
    // la variable de template 'okURL'
    #[TµReferer(urlVar: 'okURL')]
    public function action25() { }

    // autorisé pour un referer dont l'URL correspond à celle stockée dans
    // la clé 'refererUrl' de la configuration étendue 'x-security'
    // (dans le fichier 'etc/temma.php')
    #[TµReferer(urlConfig: true)]
    public function action26() { }

    // redirection vers l'URL définie s'il n'y a pas de referer
    #[TµReferer(redirect: '/login')]
    public function action27() { }

    // redirection vers l'URL définie dans la variable de template 'redirRef'
    #[TµReferer(redirectVar: 'redirRef')]
    public function action28() { }

    // redirection vers l'URL stockée dans la clé 'refererRedirect' de la
    // configuration étendue 'x-security' (dans le fichier 'etc/temma.php')
    #[TµReferer]
    public function action29() { }
}