iGalerie

Vous n'êtes pas identifié(e).

#1 23-09-2022 18:46:25

clautier
Membre
Inscription : 23-09-2022
Messages : 5

protection iframe

Je suis en train de monter un site WordPress et je n'ai pas trouvé d'extension qui me convienne pour gérer les photos comme je l'entend. Mon choix s'est porté sur iGalerie. Bien entendu, il est installé dans un répertoire à côté de WP et il est administré indépendamment. Pour l'intégrer au site, j'ai opté pour la facilité, j'ai fait une page WP avec du code HTML contenant juste un tag iframe vers mon site iGalerie. Ca fonctionne bien. Trop bien, si je le fait, d'autres peuvent le faire... Autrement dit, n'importe quel site iGalerie peut être "volé" par un autre.

On peut interdire l'exécution dans une iframe au travers du .htaccess, mais c'est radical, on ne peut pas l'autoriser pour certains sites.

J'ai trouvé un moyen pour autoriser l'inclusion de la galerie dans un autre site du même domaine : il faut ajouter au début de la fonction "start" de la classe "Gallery" (dans fichier "Gallery.class.php" du répertoire "includes/gallery/classes"), le code suivant. Ce code détecte si on s'exécute dans une iframe et, dans ce cas là, vérifie que l'appelant appartient bien au même domaine.

        if(isset($_SERVER['HTTP_SEC_FETCH_DEST']) and $_SERVER['HTTP_SEC_FETCH_DEST'] == 'iframe') {
            $cpl_host = $_SERVER['HTTP_HOST'];
            $cpl_pospoint1 = strrpos($cpl_host, '.', -1);
            $cpl_pospoint2 = strrpos($cpl_host, '.', -(strlen($cpl_host)-$cpl_pospoint1+1));
            $cpl_domaine = substr($cpl_host, $cpl_pospoint2+1);
            if(isset($_SERVER['HTTP_REFERER'])) { //correct domain:
            $cpl_ar=parse_url($_SERVER['HTTP_REFERER']);
                if (strpos($cpl_ar['host'], $cpl_domaine) === false ){
                    header('HTTP/1.0 403 Forbidden');
                    exit('Interdit - Forbidden');
                }
            }
        }

Pourriez-vous regarder la pertinence de ce code, si ce seul endroit permet de gérer toutes les pages hors admin? Serait-il opportun de l'inclure dans le logiciel?

Je vous remercie de m'avoir lu et souhaite à tout le monde une agréable journée.

Hors ligne

#2 02-10-2022 13:24:30

Manu64
Membre
Inscription : 24-12-2020
Messages : 25
Site Web

Re : protection iframe

Bonjour.
J'aurais fait plus simple ...
Un lien vers la galerie et un lien retour vers le WP.

Hors ligne

#3 03-10-2022 08:37:25

clautier
Membre
Inscription : 23-09-2022
Messages : 5

Re : protection iframe

Bonjour et merci de la réponse.
Bien sûr, ça fonctionne aussi, mais, sauf erreur de ma part, ça ne répond pas à mon souhait d'intégrer la galerie dans mon site WP. Votre solution va afficher le site iGalerie pleine page en effaçant le site WP. Ma solution conserve les hauts/bas de page, menus, mises en forme etc... de WP autour de la galerie.
Mais peut-être que mon script est incomplet pour fonctionner dans tous les cas.

Hors ligne

#4 03-10-2022 16:14:35

David
Développeur d'iGalerie
Inscription : 12-05-2006
Messages : 4 211
Site Web

Re : protection iframe

Salut,

L'idée est intéressante mais ton code ne fonctionne pas si le serveur est "localhost" ou une adresse IP (127.0.0.1).

De plus, ça ne protège pas certains scripts comme "file.php" ou "rss.php", qui n'utilisent pas la classe "Gallery".

Pour résoudre ces deux problèmes, je propose le code suivant :

if (($_SERVER['HTTP_SEC_FETCH_DEST'] ?? '') == 'iframe'
&& isset($_SERVER['HTTP_REFERER'])
&& (parse_url($_SERVER['HTTP_REFERER'])['host'] ?? '')
!= parse_url($_SERVER['HTTP_HOST'])['host'])
{
    die(App::httpResponse(403));
}

à placer dans le fichier includes/prepend.php à la ligne 145.

Hors ligne

#5 04-10-2022 16:53:01

clautier
Membre
Inscription : 23-09-2022
Messages : 5

Re : protection iframe

Bonjour,
C'est sûr qu'en étant développeur, on trouve mieux le bon endroit où mettre le code. C'est pour ça d'ailleurs que j'ai posté ma question, parce que je me doutais que je n'y étais pas. Tes remarques sur le code sont aussi pertinentes, mais ne sont pas fondées, je pense, dans le contexte, si je peux me permettre.

Là on teste que le site principal et le site dans l'iframe sont sur la même url. Moi, je cherche à tester qu'ils sont dans le même domaine, autrement dit le dernier token de l'url. Et je cherche à vérifier qu'une galerie avec une url sur un "vrai" domaine (domaine.fr, pas adresse IP ou autre) ne sera pas volée.


Ton code fonctionne si la galerie est dans un sous-dossier du site principal, mais pas dans un sous-domaine.

Au passage, petite erreur, de copier-coller je suppose: c'est != parse_url($_SERVER['HTTP_HOST'])['path']).

En tout cas, merci beaucoup pour la réponse qui m'a fait avancé dans ma réflexion.
Bonne fin de journée

Hors ligne

#6 04-10-2022 21:51:56

David
Développeur d'iGalerie
Inscription : 12-05-2006
Messages : 4 211
Site Web

Re : protection iframe

Je viens de trouver une bien meilleure solution : l'utilisation de l'en-tête HTTP Content-Security-Policy: frame-ancestors.

Il suffirait de rajouter une seule ligne de code dans le fichier prepend.php :

header("Content-Security-Policy: frame-ancestors 'self'");

Et si l'on souhaite autoriser tous les sous-domaines d'un site :

header("Content-Security-Policy: frame-ancestors 'self' https://*.example.com");

Du coup, pour conserver le choix des sites autorisés lors de chaque mise à jour d'iGalerie, on pourrait faire ceci :

header("Content-Security-Policy: frame-ancestors 'self' " . CONF_HTTP_CSP_FRAME_ANCESTORS);

Avec CONF_HTTP_CSP_FRAME_ANCESTORS comme constante à définir dans le fichier de configuration config/conf.php :

define('CONF_HTTP_CSP_FRAME_ANCESTORS', '');

Hors ligne

#7 05-10-2022 15:46:32

clautier
Membre
Inscription : 23-09-2022
Messages : 5

Re : protection iframe

Bravo,

Je viens encore de découvrir quelque chose ! J'ai parcouru la doc sur la CSP et apparemment on peut l'utiliser sans contre indication, tous les navigateurs la supportent.

La forme qui convient à mon cas est la deuxième ligne. Pour apporter ma contribution, je la rendrais dynamique, en allant chercher le domaine du site de iGalerie. Ce qui donne:

preg_match('/[^.]+\.[^.]+$/', $_SERVER['HTTP_HOST'], $matches);
header("Content-Security-Policy: frame-ancestors 'self' https://*.$matches[0]");

Je n'ai pas eu de mal pour le preg_match, c'est un des exemples de la description de la fonction, j'ai fait un copier/coller. Cette fonction retourne dans $matches[0], les 2 derniers segments du host.

David, pour éviter d'avoir à le refaire à chaque mise à jour, le mieux est de l'intégrer dans le noyau.... sous cette forme ou avec un peu de paramétrage.

Hors ligne

#8 17-11-2022 19:59:21

JPG
Membre
Inscription : 25-02-2020
Messages : 11
Site Web

Re : protection iframe

Bonjour,
Comment fait-on pour mettre dans une iframe, si quelq'un peut me donner un coup de main je suis preneur,
merci beaucoup
cordialement,

Dernière modification par JPG (17-11-2022 20:00:47)

Hors ligne

#9 18-11-2022 09:49:14

clautier
Membre
Inscription : 23-09-2022
Messages : 5

Re : protection iframe

Bonjour,
Sur un site WordPress, tu fais une page que tu appelles vraissemblablement dans le menu principal, sinon où tu veux. Cette page sera constituée d'un seul bloc HTML qui contiendra le texte suivant:

<iframe src="https://photos.mondomaine.fr" width="100%" height="700px">
</iframe>

photos.mondomaine.fr est à remplacer par le site de la galerie; mondomaine.fr doit correspondre au domaine du site WordPress.
700px du height peut être adapté à ton site.

Hors ligne

#10 18-11-2022 17:04:10

JPG
Membre
Inscription : 25-02-2020
Messages : 11
Site Web

Re : protection iframe

Bonjour  Clautier

merci pour l'info

cordialement

Hors ligne

Pied de page des forums