Sécurité
Bonnes pratiques de sécurité pour l'intégration de campagnes Gapila.
La sécurité est au cœur du système d'embed Gapila. Ce guide détaille les mécanismes de protection et les bonnes pratiques à suivre.
Architecture de sécurité
Tokens JWT
Chaque lien d'embed contient un token JWT (JSON Web Token) signé :
https://play.gapila.com/embed/wheel/GAME_ID?token=eyJhbGciOiJIUzI1NiIs...
Contenu du token :
{
"gameId": "abc123-def456",
"accountId": "owner-account-id",
"origin": "monsite.com",
"gameType": "wheel",
"iat": 1703678400,
"exp": 1703680200
}
Protections :
| Protection | Description |
|---|---|
| Signature HMAC-SHA256 | Impossible de falsifier le token |
| Expiration courte | 5 minutes pour un token obtenu par embed.js, renouvelé automatiquement avant son expiration ; 30 minutes, sans renouvellement, pour un lien généré depuis le tableau de bord (exemple ci-dessus) |
| Origin binding | Le token est lié à un domaine spécifique |
| Game binding | Le token est lié à une campagne spécifique |
Validation d'origine
À chaque chargement, Gapila vérifie :
- Signature du token : Le token n'a pas été modifié
- Expiration : Le token n'a pas expiré
- Origin : Le domaine de l'iframe correspond à celui du token
- Whitelist : Le domaine est dans votre liste autorisée
- Campagne : La campagne existe et est publiée
Isolation CSS
L'iframe crée un contexte d'exécution isolé :
- Les styles de votre site n'affectent pas le jeu
- Les styles du jeu n'affectent pas votre site
- Le JavaScript est isolé (sandbox)
Bonnes pratiques
1. Protéger vos tokens
Ne jamais :
- Publier vos tokens dans du code public (GitHub, etc.)
- Partager vos tokens en clair
- Stocker les tokens dans le localStorage/sessionStorage
Toujours :
- Utiliser
embed.js, qui génère un token neuf à chaque affichage - Utiliser HTTPS sur votre site
2. Laisser embed.js générer les tokens (recommandé)
Avec le script d'intégration, vous n'avez aucun token à générer ni à stocker côté serveur. Le script utilise votre clé publique pk_live_… pour obtenir un token signé, lié à votre domaine, puis le renouvelle avant son expiration :
<script src="https://play.gapila.com/embed.js" data-key="pk_live_…" data-game="votre-game-id" data-mode="inline"> </script>
La clé publique n'est pas un secret. Avec pk_live_…, le navigateur n'obtient un token que depuis un domaine de votre liste autorisée. Ce contrôle empêche un site tiers d'afficher votre jeu ; ce n'est pas une barrière d'accès, car un programme hors navigateur peut imiter l'origine d'une requête. Les participations restent protégées par la vérification anti-robot, le plafond de participations et la limite de débit. pk_test_… fonctionne depuis n'importe quel domaine et ne crée que des participations de test.
Vos clés pk_live_… et pk_test_… s'affichent dans Réglages → Intégration, pour les membres autorisés à gérer les réglages du compte ; le script proposé utilise par défaut la clé pk_live_…, la clé pk_test_… reste disponible pour la recette. Si une clé doit être remplacée, Régénérer la révoque immédiatement et en crée une nouvelle : le script installé avec l'ancienne clé cesse d'afficher le jeu, remplacez-le par le nouveau.
3. Vérifier les messages postMessage
Toujours valider l'origine des messages :
window.addEventListener('message', function(event) {
// CRITIQUE : Vérifier l'origine
if (event.origin !== 'https://play.gapila.com') {
return;
}
// Valider le format du message
if (!event.data || typeof event.data.type !== 'string') {
return;
}
// Traiter le message...
});
4. Utiliser le sandbox
Renforcez la sécurité avec l'attribut sandbox :
<iframe src="URL_EMBED" sandbox="allow-scripts allow-same-origin allow-forms allow-popups"> </iframe>
Permissions minimales :
allow-scripts: JavaScript requisallow-same-origin: Cookies/storage requisallow-forms: Formulaires requisallow-popups: Liens externes (optionnel)
5. Content Security Policy (CSP)
Si votre site applique une CSP, autorisez Gapila dans trois directives : script-src (chargement de embed.js), connect-src (le script obtient un token auprès de Gapila) et frame-src (le jeu s'affiche dans une iframe) :
<meta http-equiv="Content-Security-Policy" content="script-src 'self' https://play.gapila.com; connect-src 'self' https://play.gapila.com; frame-src https://play.gapila.com;">
Ou via header HTTP :
Content-Security-Policy: script-src 'self' https://play.gapila.com; connect-src 'self' https://play.gapila.com; frame-src https://play.gapila.com;
Pour une intégration par iframe seule (sans embed.js), frame-src suffit.
6. Surveillance et audit
Surveillez l'utilisation de vos embeds :
- Consultez les statistiques dans Gapila
- Surveillez les erreurs de token
- Alertez en cas d'activité suspecte
Menaces et protections
Clickjacking
Protection : la page du jeu est volontairement intégrable par n'importe quel site (frame-ancestors *) : c'est ce qui permet de l'afficher chez vous. La protection porte sur le token : embed.js n'en obtient un que depuis un domaine de votre liste autorisée, et les participations vérifient que l'origine de la requête correspond au domaine du token.
Token theft
Protection :
- Expiration courte : 5 minutes avec renouvellement automatique par
embed.js, 30 minutes pour un lien généré depuis le tableau de bord - Origin binding (le token ne fonctionne que sur votre domaine)
- HTTPS obligatoire en production
Cross-Site Scripting (XSS)
Protection :
- Isolation iframe
- Sandbox restrictions
- Validation stricte des inputs
Man-in-the-Middle (MITM)
Protection :
- HTTPS obligatoire
- Signature JWT
- Validation serveur
Checklist de sécurité
Avant la mise en production :
- [ ] HTTPS activé sur votre site
- [ ] Intégration via
embed.js(pas de token en dur dans le code) - [ ] Vérification de l'origine dans les handlers postMessage
- [ ] Sandbox configuré (intégration par iframe seule)
- [ ] CSP mis à jour pour autoriser Gapila
- [ ] Domaines de production ajoutés dans Gapila
- [ ] Domaines de test/staging séparés
Signaler une vulnérabilité
Si vous découvrez une faille de sécurité :
- Ne pas la divulguer publiquement
- Contactez-nous à security@gapila.com
- Fournissez les détails techniques
- Attendez notre confirmation avant divulgation
Prochaines étapes
- Dépannage - Résoudre les problèmes courants
- Configuration - Options de configuration