Restreindre l’accès à un site : SSO, filtrage par REFERER, autres solutions ?

Nouveau WRInaute
Bonjour tout le monde,

En qq mots : Je souhaiterais faire en sorte qu’un site ne soit accessible que depuis un lien figurant sur un autre site (sur une page sécurisée), et qu'il ne soit pas visible (ou du moins, qu’il soit difficile à trouver…) par un internaute "lambda". J’aimerais connaître les différentes approches envisageables pour arriver à ce résultat. Je précise que je suis débutant en développement web et PHP.

Voici les caractéristiques des 2 sites :

a) Le site A est un site institutionnel. Il a été développé en ASP.NET et est hébergé chez un prestataire, sous Windows/IIS. Il s'agit d'un système propriétaire, sur lequel nous n'avons que partiellement la main.

b) Le site B (celui que j’ai prévu de créer) est un mini-site consistant en un dictionnaire scientifique spécialisé. Il sera hébergé sur un autre serveur (peut-être en local) et sera associé à un sous-domaine. J'ai déjà pas mal travaillé sur les données, j'ai créé la base MySQL et j'ai fait une première ébauche d'interface de recherche. Le projet me paraît assez facile, à un détail près…

Voici le problème :

Je pensais pouvoir mettre ce site B en accès libre (ou au pire, mettre en place un système d'inscription et d'authentification distinct de celui du site A) mais mon directeur voit les choses autrement : il souhaite que le site B ne soit accessible qu’aux utilisateurs authentifiés sur le site A (via un lien sur une page sécurisée) et que ces utilisateurs n'aient pas à s'authentifier une 2e fois sur le site B. En même temps, il reconnaît que l'accès au site B n'a pas besoin d'être très sécurisé. En fait, il veut simplement qu'un internaute "lambda" ne puisse pas y accéder facilement (ni évidemment, tomber dessus via Google), mais il ne jugerait pas très grave qu'une minorité de gens arrive à contourner le système.

En résumé : il doit y avoir une porte pour dissuader la "masse" des gens d'entrer, mais si la porte n'est pas fermée à clé, ce n'est pas très grave.

Voici mes questions :

Compte tenu de ces demandes, j'imagine plusieurs possibilités :

a) Mise en place d'un SSO entre les 2 sites : je ne me rends pas compte de la faisabilité et de la complexité de ce genre de développement. Savez-vous ce que ce que ça impliquerait techniquement de mon côté (site B) et éventuellement du côté du prestataire (site A) ?

b) "Camouflage" du site B via diverses techniques : je pense que cela pourrait largement suffire (car on n'a pas besoin d'un niveau de sécurité élevé), mais je ne sais pas dans quelle mesure c’est faisable. Dans la configuration des htaccess, j'ai lu qu'il était possible de mettre en place un filtrage par REFERER, de façon à n'autoriser que les visiteurs en provenance du site A : est-ce une bonne solution ? Je m'interroge aussi sur la possibilité de faire en sorte que le site B soit associé à une URL complexe, difficile à deviner par une personne lambda, mais je ne sais pas si c'est réalisable…

Voilà. Savez-vous si ces solutions sont réalistes, si elles sont faciles à mettre en œuvre, ce qu'elles impliquent comme difficultés, etc. ? Sinon, existe-t-il d'autres solutions ?

Un grand merci d'avance à celles et ceux qui pourront m'éclairer !

Pascal
 
WRInaute passionné
Oui je pense que l'option B, avec une condition avec un simple stripos() sur la valeur du referrer suffira..
Après il faut simplement voir dans quels cas le referrer n'est pas renseigné (peut être si le site A est en https, je ne sais pas) mais si il n'y a pas ce problème, alors ca fonctionne bien..

Code:
if (stripos($_SERVER['HTTP_REFERER'], 'siteA') !== FALSE) {
 Affiche le site
} else {
 Affiche une page d'erreur ou rien (exit;)
}

Du coup ca ne fonctionnera que pour la première page visitée.. Il faut que le site B serve uniquement à afficher une seule page à chaque visite en provenance du site A, donc comme un lexique..
Mais si tu veux que le siteB soit ensuite navigable par l'internaute qui est venu du siteA, alors tu dois ajouter dans ce code une histoire de cookie ou autre technique.. :)
 
WRInaute accro
pascalpa a dit:
hébergé sur un autre serveur (peut-être en local) et sera associé à un sous-domaine.
Il y a moyen d'associer un cookies a plusieurs sous domaine. J'utilise ça pour être connecté sur plusieurs site (multilingue) en sous domaine fr.example.com ; en.example.com etc ...
De mémoire faut associer le cookies au domaine (pas a un sous domaine précis) pour que tu puisse le consulter depuis tous les sous domaine.

Partant de la tu sais facilement choper une info sur le visiteur (est il authentifié sur le site principal par exemple) et réagir en conséquence ... comme délivrer une page ou pas.
 
WRInaute accro
le mieux serait d'utiliser des variables de session, avec la création d'une session sur le site b directement depuis le site a
 
Nouveau WRInaute
Salut,
personnellement, je combinerais les réponses de FortTrafic et de Leonick.

Dans un premier temps, tu vérifies si l'utilisateur a le droit d'afficher la page, en utilisant une variable de session:
Code:
if(!isset($_SESSION['auth']) || $_SESSION['auth']!=1){
   // Le visiteur n'a pas encore été autorisé, on vérifie sa provenance
   if (stripos($_SERVER['HTTP_REFERER'], 'siteA') !== FALSE) {
      // Sa provenance est valide, on enregistre dans la session le fait que l'utilisateur est autorisé
      $_SESSION['auth'] = 1;
   } else {
      Affiche une page d'erreur ou rien (exit;)
   }
}

if(isset($_SESSION['auth']) && $_SESSION['auth']!=1){
   // Le visiteura été autorisé, on affiche le site
}
 
Nouveau WRInaute
Merci pour toutes vos réponses... et désolé d'y répondre avec autant de retard !

La solution du REFERER m'a été déconseillée sur plusieurs forums, car il peut être bloqué par les navigateurs (et/ou certains firewalls aussi, je pense). Après je ne sais pas... c'est peut-être à tester quand même. L'idée d'utiliser les cookies sur plusieurs sous-domaines ne serait pas mal, mais on sera vraiment sur 2 serveurs différents, donc je ne sais pas si ça peut marcher... (si qq1 a des précisions, je suis preneur.) Idem pour les variables de session entre les 2 serveurs : je ne vois pas trop comment faire fonctionner cela (d'autant que je n'ai pas la main sur le serveur A).

Au final la suggestion de Leica69 ("je combinerais les réponses de FortTrafic et de Leonick") m'a mis sur la bonne voie : merci ! En fait, je pense faire à peu près la même chose, mais en me basant sur un ID, plutôt que sur le REFERER (mais si je peux combiner les 2 techniques, pourquoi pas...). Concrètement, je transmettrais un code dans l'URL, puis je créerais une session si le code est OK. Je sais que ce n'est pas ce qu'on appelle "sécurisé", mais ça a le mérite d'être simple et je pense que ça peut suffire (avis contraires bienvenus ! :))
 
Discussions similaires
Haut