Le WordPress d'aujourd'hui, décodé pour les développeurs

Sécurité

Ajouter Cross-Origin-Opener-Policy pour isoler un iframe de paiement tiers

Un widget de paiement embarqué en iframe partage par défaut son contexte de navigation avec la page qui l'accueille. Les étapes pour l'isoler sans casser le tunnel de paiement.

Par WordPress Développement • 25 avril 2021 • 4 min de lecture • Aucun commentaire
Ajouter Cross-Origin-Opener-Policy pour isoler un iframe de paiement tiers

Cross-Origin-Opener-Policy: same-origin : cette ligne d’en-tête HTTP isole une fenêtre de navigation des autres fenêtres ou onglets ouverts par des origines différentes, en empêchant tout accès direct entre leurs objets window respectifs. Pour une page qui embarque un widget de paiement tiers en iframe, cette isolation limite ce que le contenu de l’iframe pourrait autrement observer ou manipuler dans la fenêtre principale, et inversement.

Étape 1 : comprendre ce que COOP isole précisément

Sans cet en-tête, une page ouverte depuis un lien ou un formulaire peut, dans certains cas, conserver une référence à la fenêtre d’origine via la propriété JavaScript window.opener. Un widget de paiement qui ouvrirait une fenêtre de confirmation dans un nouvel onglet pourrait alors, en théorie, interagir avec la fenêtre d’origine si celle-ci n’a pas explicitement coupé ce lien. L’en-tête Cross-Origin-Opener-Policy ferme cette possibilité en isolant le contexte de navigation par origine.

Étape 2 : choisir la bonne valeur pour un tunnel de paiement

Trois valeurs principales existent : unsafe-none, qui conserve le comportement historique sans isolation, same-origin-allow-popups, qui isole la page tout en conservant une relation limitée avec les fenêtres qu’elle ouvre elle-même, et same-origin, l’isolation la plus stricte. Pour une page qui ouvre une fenêtre de paiement tierce en popup et doit ensuite recevoir une confirmation de cette fenêtre, same-origin-allow-popups constitue généralement le bon compromis, car same-origin strict couperait la communication nécessaire au retour de confirmation.

L'essentiel à retenir : COOP isole le contexte de navigation d'une origine à l'autre ; Une mauvaise valeur casse une redirection de paiement légitime ; Le test doit couvrir tout le tunnel, pas seulement l'affichage initial

Étape 3 : déclarer l’en-tête côté serveur

<IfModule mod_headers.c>
    Header always set Cross-Origin-Opener-Policy "same-origin-allow-popups"
</IfModule>

Sur WordPress, cette déclaration peut aussi passer par le filtre wp_headers, ce qui évite de dépendre uniquement de la configuration serveur et permet de la limiter à certains gabarits de page seulement, comme la page de paiement :

add_filter('wp_headers', function (array $headers) {
    if (is_page('paiement')) {
        $headers['Cross-Origin-Opener-Policy'] = 'same-origin-allow-popups';
    }
    return $headers;
});

Étape 4 : tester l’intégralité du parcours de paiement

L’erreur la plus fréquente consiste à tester uniquement l’affichage initial du widget, sans dérouler le parcours complet jusqu’à la page de confirmation. Un tunnel qui ouvre plusieurs fenêtres successives, ou qui redirige via une page intermédiaire hébergée sur un autre domaine, peut révéler un blocage inattendu uniquement à cette étape avancée si la valeur choisie est trop stricte pour ce schéma précis.

  • Dérouler un paiement de test jusqu’à sa confirmation complète, dans un navigateur avec la console de développement ouverte.
  • Vérifier l’absence d’erreur liée à une fenêtre bloquée ou à une communication refusée entre fenêtres.
  • Répéter le test sur un navigateur mobile, où le comportement des popups diffère parfois de celui d’un ordinateur de bureau.

Étape 5 : documenter la valeur choisie et sa raison

Un commentaire proche de la déclaration de l’en-tête, précisant pourquoi same-origin-allow-popups a été retenu plutôt que la valeur la plus stricte, évite qu’une future revue de sécurité durcisse cette valeur sans tester l’impact sur le tunnel de paiement, et casse ainsi un parcours qui fonctionnait jusque-là.

Ce que COOP n’isole pas à lui seul

Cross-Origin-Opener-Policy agit sur le contexte de navigation entre fenêtres, pas sur le contenu d’une iframe intégrée directement dans la page, qui reste régie par d’autres mécanismes comme l’attribut sandbox ou l’en-tête Content-Security-Policy. Un widget de paiement affiché directement en iframe plutôt que via une fenêtre popup ne bénéficie donc pas de cette isolation particulière, et nécessite une revue distincte de ses propres restrictions d’intégration.

En résumé

Cross-Origin-Opener-Policy isole efficacement le contexte de navigation d’une page vis-à-vis des origines tierces qu’elle embarque ou qu’elle ouvre, à condition de choisir la valeur adaptée au schéma réel du tunnel de paiement concerné. Une valeur trop stricte casse la communication nécessaire au retour de confirmation ; une valeur absente laisse la porte ouverte à une interaction non désirée entre fenêtres d’origines différentes.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi