Vous n'êtes pas identifié(e).
- Discussions : Actives | Sans réponse
Annonce
Pensez d'abord à lire la FAQ, vous y trouverez probablement une solution à votre problème.
Pages : 1
#1 23-09-2022 18:46:25
- clautier
- Membre
- Inscription : 23-09-2022
- Messages : 12
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
#3 03-10-2022 08:37:25
- clautier
- Membre
- Inscription : 23-09-2022
- Messages : 12
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
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 : 12
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
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 : 12
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
#9 18-11-2022 09:49:14
- clautier
- Membre
- Inscription : 23-09-2022
- Messages : 12
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
#11 26-11-2023 19:45:40
- clautier
- Membre
- Inscription : 23-09-2022
- Messages : 12
Re : protection iframe
Bonjour David, et les autres aussi...
Je viens d'installer la version 3.0.21 et j'ai remarqué que la modification dont tu parles plus haut est incluse, avec modification du fichier configuration.
Merci beaucoup
Hors ligne
Pages : 1