Aller au contenu

Sécurité

AppFly écrit et exécute du code pour vous. Voici exactement ce que cela implique pour vos données : la frontière d'isolation, ce qui est chiffré, ce qui n'est jamais collecté et ce qui arrive à tout cela quand vous partez.

Une app ne peut pas atteindre une autre

Chaque app reçoit sa propre base Postgres et son propre rôle de connexion, créé avec REVOKE CONNECT … FROM PUBLIC. L'isolation est une propriété de la base de données, pas du code applicatif : une requête écrite par un agent dans une app ne peut pas atteindre les données d'une autre, même s'il essaie.

Chaque app tourne aussi dans son propre conteneur, avec son propre espace de travail sur disque. Seul l'hôte est partagé.

Les secrets sont chiffrés et jamais affichés en entier

Les clés de fournisseurs, les jetons et les variables d'environnement sont chiffrés au repos avec AES-256-GCM. Seul un indice masqué — les quatre derniers caractères — est renvoyé à une page, si bien qu'un écran ou un journal de build ne peut jamais divulguer un identifiant complet.

Les clés sont écrites dans le .env de l'app générée, dans son propre espace de travail, le seul endroit qui puisse les lire. Nous n'émettons qu'une seule variable d'environnement : l'URL de la base de données de l'app, puisque c'est nous qui la provisionnons.

Les données de vos clients ne nous appartiennent pas

AppFly conserve les comptes, les domaines de boutique, les prompts et le code généré. Il ne lit jamais les clients, les commandes ni les données personnelles de votre boutique, et les autorisations que nous demandons à Shopify ne les incluent pas.

Shopify impose à chaque app de répondre à trois webhooks de conformité, et nous répondons aux trois. Les deux sujets liés aux données clients sont acquittés par une ligne de journal attestant que nous avons vérifié et ne détenions rien — la réponse qu'un marchand peut avoir besoin que nous ayons archivée.

Supprimer est la règle, pas un ticket de support

Supprimer une app efface son conteneur, sa base de données, ses fichiers, son déploiement, son enregistrement DNS et ses accès. La ligne en base est effacée en dernier, pour qu'une suppression interrompue soit relancée au lieu de laisser un orphelin actif.

Désinstaller depuis Shopify efface tout ce qui appartient à votre boutique sous 48 heures. Une tâche planifiée s'exécute toutes les cinq minutes pour terminer ce que la désinstallation n'a pas pu faire, afin qu'une suppression interrompue ne ressuscite jamais en app active.

La déconnexion révoque la session côté serveur. La fermeture de votre compte supprime tout ce que prévoit la Politique de confidentialité (en anglais).

Les limites que nous tenons

Chaque requête vers une page connectée est authentifiée, et les routes d'API répondent à un appel non authentifié par un 401 lisible plutôt que par une page de connexion HTML.

Les webhooks de facturation sont signés et vérifiés sur le corps brut de la requête. Un déploiement sans secret de webhook renvoie 404 pour ce point d'accès — non signé veut dire non authentifié, pas ouvert — et une signature invalide renvoie 401.

La console d'administration est protégée par un mot de passe et un cookie signé, et ses opérations privilégiées sont une liste fixe de fonctions, sans shell générique. Elle n'est pas accessible depuis le site public et robots.txt l'exclut.

Signaler une vulnérabilité

Envoyez-la à [email protected] avec assez de détails pour la reproduire et une idée de son impact. Nous en accuserons réception et vous dirons ce que nous faisons. Laissez-nous un délai raisonnable avant toute divulgation publique, et ne testez pas sur les données d'autres clients.

Pour tout ce qui ne relève pas de la sécurité, écrivez à [email protected].