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://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 (30 min) | Limite la fenêtre d'utilisation |
| 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 :
- Générer un nouveau token pour chaque session
- Utiliser HTTPS sur votre site
- Implémenter un backend pour générer les tokens dynamiquement
2. Génération dynamique (recommandé)
Au lieu d'utiliser un token statique, générez-le côté serveur :
// Votre backend (Node.js exemple)
app.get('/api/gapila-embed', async (req, res) => {
// Vérifier l'authentification de l'utilisateur
if (!req.user) {
return res.status(401).json({ error: 'Non autorisé' });
}
// Appeler l'API Gapila pour générer un token
const response = await fetch('https://api.gapila.com/v1/embed/token', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.GAPILA_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
gameId: 'votre-game-id',
origin: req.headers.host
})
});
const { embedUrl } = await response.json();
res.json({ embedUrl });
});
// Votre frontend
async function loadGame() {
const response = await fetch('/api/gapila-embed');
const { embedUrl } = await response.json();
document.getElementById('gapila-iframe').src = embedUrl;
}
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.match(/^https:\/\/(www\.)?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)
Configurez votre CSP pour autoriser Gapila :
<meta http-equiv="Content-Security-Policy" content="frame-src https://gapila.com https://www.gapila.com;">
Ou via header HTTP :
Content-Security-Policy: frame-src https://gapila.com https://www.gapila.com;
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 : L'iframe Gapila ne peut pas être elle-même intégrée dans un autre iframe malveillant grâce aux headers X-Frame-Options.
Token theft
Protection :
- Expiration courte (30 min)
- 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
- [ ] Token généré dynamiquement (pas en dur dans le code)
- [ ] Vérification de l'origine dans les handlers postMessage
- [ ] Sandbox iframe configuré
- [ ] 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