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 :

ProtectionDescription
Signature HMAC-SHA256Impossible de falsifier le token
Expiration (30 min)Limite la fenêtre d'utilisation
Origin bindingLe token est lié à un domaine spécifique
Game bindingLe token est lié à une campagne spécifique

Validation d'origine

À chaque chargement, Gapila vérifie :

  1. Signature du token : Le token n'a pas été modifié
  2. Expiration : Le token n'a pas expiré
  3. Origin : Le domaine de l'iframe correspond à celui du token
  4. Whitelist : Le domaine est dans votre liste autorisée
  5. 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 requis
  • allow-same-origin : Cookies/storage requis
  • allow-forms : Formulaires requis
  • allow-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é :

  1. Ne pas la divulguer publiquement
  2. Contactez-nous à security@gapila.com
  3. Fournissez les détails techniques
  4. Attendez notre confirmation avant divulgation

Prochaines étapes