< Retour

Lien externe sécurisé

Mercredi 26 janvier 2022 - 11:28

Introduction

Un lien externe sécurisé est utilisé pour fournir à un utilisateur un accès à des données privées sans qu'il lui soit nécessaire de se connecter à son compte.

L'utilisation la plus fréquente est le lien contenu dans un email pour accéder à l'interface de ré-initialisation d'un mot de passe. Le deuxième usage le plus fréquent est le lien utilisé pour la sécurisation des paiements en ligne.

De tels liens doivent respecter des règles de sécurité fondamentales :

  • le lien ne doit contenir aucune donnée privées
  • le lien est à usage unique
  • la validité du lien est limité dans le temps
  • le lien ne doit pas permettre de se connecter automatiquement à un compte utilisateur

Dans certains cas, quelques unes de ses règles peuvent être ignorées : exemple dans pilote, quand un utilisateur crée un ticket, l'email envoyé contient un lien pour accéder au ticket. Dans ce cas, le lien n'a pas de limite de validité dans le temps et son nombre d'utilisation est infini.

Présentation

Le lien généré est de la forme :

https://{url}/request?c=d18ef6da6cf722678094cc3f692d31b1

Le code c permet de faire le lien avec les données enregistrées pour la résolution du lien.

Mise en oeuvre

La résolution du lien s'appuie sur l'utilisation des routes. Il est nécessaire de rajouter la déclaration de la route dans cicrouter.php : 

icRouter::addRoute(array('name'=>'request', 'action'=>0, 'layout' =>'_layoutRequest'));

et la fonction _layoutRequest dans la classe Start (fichier start.php)

public function _layoutRequest(){
        // Verification de la validité
        $code = ic::getString('c');
        $oRequest = new icRequest($code);
        if ( $oRequest->isExpired() ){
            $this->_layoutCnx('Lien périmé ou invalide');
        }        // Si un layout est defini, l'appeler
        $layout = $oRequest->layout;
        if ( !empty($layout) ){
            if ( method_exists($this, $oRequest->layout)){
                call_user_func_array( array($this, $oRequest->layout), [$code]);
            }
            else{
                ic::render('403.html', null);
            }
        }
        return false;
    }

La construction du lien se fait en utilisant la classe icRequest :

$oRequest = new icRequest();
$oRequest->addArg('email', $aEmail);
$lnk = $oRequest->create('_layoutResetPwd', 1);

La méthode addArg permet d'enregistrer les données à conserver et qui seront disponibles lors du traitement. 

La méthode create prend en argument le nom de la méthode qui sera appelée et la durée de validité du lien en nombre de jour. La méthode doit être implémenté dans la classe start du fichier start.php. 

La base de données du projet doit avoir une table request de la forme :

CREATE TABLE `ic_requests` (
  `requ_id` int(11) NOT NULL AUTO_INCREMENT,
  `requ_state` int(11) NOT NULL DEFAULT 1,
  `requ_code` varchar(250) NOT NULL,
  `requ_args` varchar(250) NOT NULL,
  `requ_validdate` datetime DEFAULT NULL COMMENT 'Date de validite',
  `requ_cre` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `requ_updt` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`requ_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

 

Neutraliser le lien

Une fois utilisé, il est important de neutraliser le lien pour qu'il ne soit plus utilisable. S'il n'est pas neutralisé, il pourra être cliqué et le traitement relancé. Toutefois il sera automatiquement neutralisé une fois la durée de validité dépassée.

$oRequest = new icRequest($aCode);
$oRequest->delete();

 

Sommaire de l'article