Une liste de vérification avant de lancer une appli créée par IA, avec un test pour chaque point.
Les outils d’IA produisent vite des démos qui marchent, et ce sont toujours les mêmes trous : des clés secrètes envoyées au navigateur, des routes d’API qui ne vérifient jamais qui demande, aucune sauvegarde testée, aucune limite sur la connexion. Voici neuf vérifications à faire avant l’arrivée de vrais utilisateurs, chacune avec la commande ou le clic qui la prouve.
Faits vérifiés le
Les neuf vérifications
| Vérification | Réussie quand |
|---|---|
| 1. Les secrets restent sur le serveur | Une recherche dans le paquet compilé pour le navigateur et dans l’historique git ne trouve aucune clé secrète |
| 2. Chaque route vérifie l’utilisateur | Connecté comme B, vous ne pouvez ni lire ni modifier les données de A |
| 3. La configuration suit l’environnement | Aucun .env dans git; l’appli refuse de démarrer sans ses variables obligatoires |
| 4. Les erreurs sont journalisées, pas affichées | Une erreur provoquée montre une page simple aux visiteurs et la pile complète dans vos journaux |
| 5. Les sauvegardes se restaurent | Vous en avez restauré une dans une base temporaire et y avez retrouvé vos données |
| 6. Votre domaine fonctionne de bout en bout | Connexion, paiements et webhooks fonctionnent sur le vrai domaine en HTTPS |
| 7. Les routes coûteuses ont une limite de débit | La 30e tentative de connexion en une minute reçoit un 429 |
| 8. Les journaux se fouillent et sont propres | Vous retrouvez une requête d’il y a une heure, et aucun mot de passe ni jeton n’y figure |
| 9. Les bases de la Loi 25 sont en place | Politique et responsable publiés, registre des incidents ouvert, emplacement des données connu |
1. Les secrets restent sur le serveur
C’est le trou le plus courant dans le code généré. Tout ce que le navigateur télécharge est public. Next.js insère chaque variable NEXT_PUBLIC_ dans le JavaScript envoyé au navigateur au moment de la compilation, et Vite fait de même avec les variables VITE_; la documentation de Vite précise qu’elles ne doivent pas contenir d’information sensible comme des clés d’API. Une clé secrète Stripe, une clé OpenAI ou une clé secrète Supabase (service_role) sous un de ces préfixes, n’importe qui peut la copier.
Vérifiez : compilez en local et fouillez le résultat, puis l’historique. Au moindre résultat, déplacez l’appel dans une route serveur et changez la clé : supprimer la ligne ne la dépublie pas.
# Build the way production does, then search what ships to the browser
npm run build
grep -rEo "sk_live_[A-Za-z0-9]{8,}|sk-[A-Za-z0-9_-]{20,}|service_role|SECRET" \
.next/static dist build 2>/dev/null | sort -u
# And the history: a key committed once is a key to rotate
git log -p | grep -nE "sk_live_|sk-[A-Za-z0-9_-]{20,}|service_role" | head2. Chaque route vérifie qui demande
Les applis générées protègent souvent la page et oublient l’API derrière. La page cache le bouton; le point de terminaison répond quand même à quiconque l’appelle. Chaque route qui lit ou écrit des données d’utilisateur doit trouver l’utilisateur connecté et filtrer en conséquence, côté serveur.
Vérifiez avec deux comptes. Connecté comme B, ouvrez une fiche de A en changeant l’identifiant dans l’URL ou la requête, puis essayez de la modifier. Vous devriez recevoir un 403 ou un 404. Appelez ensuite la même API sans témoin : curl -i https://votreappli.ca/api/orders/123 doit renvoyer 401.
Les applis exportées de Lovable ou de Bolt parlent souvent à Supabase directement depuis le navigateur : les politiques de la base sont alors la seule protection. Le guide de Supabase demande d’activer la sécurité au niveau des lignes sur chaque table d’un schéma exposé et de ne jamais utiliser une clé secrète dans le navigateur. Lancez ceci dans son éditeur SQL :
-- Every table in an exposed schema should say true
select relname, relrowsecurity
from pg_class
where relnamespace = 'public'::regnamespace and relkind = 'r'
order by relrowsecurity, relname;3. La configuration suit l’environnement
- Aucun `.env` dans git.
git ls-files | grep -E '(^|/)\.env'ne doit rien afficher, sauf un fichier d’exemple. - Échouer au démarrage, pas à la première requête. Lisez les variables obligatoires au démarrage et quittez en nommant celle qui manque. Un plantage au déploiement coûte moins cher qu’un paiement en panne à 2 h du matin.
- Les valeurs de production ne sont pas celles de test. Vraies clés de paiement, base de production, vrai expéditeur de courriels.
- Les aperçus ne touchent pas aux données de production. Chez Canner, les aperçus de demandes de tirage partagent la base du projet. Si le projet contient de vrais identifiants, désactivez les aperçus et gardez un projet de préproduction distinct avec des clés de test (comment).
4. Les erreurs sont journalisées, pas affichées
Une pile d’appels à l’écran donne à un attaquant vos chemins de fichiers, les versions de vos bibliothèques et parfois votre SQL. Les visiteurs doivent voir une page d’erreur simple; vous, la pile complète.
Vérifiez : appelez une route avec un mauvais identifiant ou provoquez une exception, et lisez le corps de la réponse. Aucune pile ne doit y figurer. Django exige DEBUG = False; les cadriciels Node, NODE_ENV=production, que Canner définit pour vous. Retrouvez ensuite cette erreur dans vos journaux.
Chez Canner, les Journaux regroupent les erreurs de Node, Python, Ruby, PHP, Go, Java et Rust, les comptent par déploiement et relient chacune au commit où elle est apparue. Un « Application error … Digest » de Next.js se colle dans la recherche pour retrouver la vraie erreur (documentation des journaux).
5. Des sauvegardes qui se restaurent
Une sauvegarde jamais restaurée, c’est un pari. Activez les sauvegardes planifiées, puis restaurez-en une et regardez dedans.
Chez Canner, une politique de sauvegarde dans l’onglet Base de données s’exécute une fois par jour avec Démarrage et jusqu’à toutes les heures sur les forfaits payants. Restaurez avec Examiner d’abord : la sauvegarde arrive dans une base temporaire que vous pouvez interroger et comparer à la base en ligne, sans toucher à la production. Canner restaure aussi chaque nuit votre sauvegarde la plus récente pour la tester et la marque Vérifiée. Voir Postgres Canner et la documentation des bases de données.
Les sauvegardes contiennent les données, pas la configuration. Exportez vos variables d’environnement (canner env --reveal --json) dans un gestionnaire de mots de passe, jamais à côté de la sauvegarde. Sans la clé qui a chiffré quelque chose dans vos données, une restauration ne peut pas le lire.
6. Votre domaine, de bout en bout
Ajouter le domaine, c’est la partie facile : deux enregistrements DNS, et Canner émet et renouvelle le certificat HTTPS (domaines personnalisés). Ce qui casse, c’est tout ce qui pointe encore vers l’ancienne URL d’aperçu.
- Les URI de redirection OAuth chez Google, GitHub ou Microsoft.
- L’URL du site et la liste de redirections permises de votre fournisseur d’authentification.
- Les points de terminaison de webhooks, Stripe et autres.
- Les listes CORS et toute variable
APP_URLouNEXTAUTH_URL.
7. Des limites de débit sur ce qui vous coûte
Connexion, inscription, réinitialisation du mot de passe, formulaires de contact et toute route qui appelle une API d’IA payante. Sans limite, la première est une cible pour deviner des mots de passe et la dernière, une facture.
Un projet Canner exécute un seul processus : un limiteur en mémoire voit donc tout le trafic du projet. Il se remet à zéro à chaque déploiement et réveil, ce qui convient pour freiner les connexions. Pour une limite qui doit survivre à un redémarrage, comme un quota quotidien d’IA par utilisateur, comptez dans Postgres; Canner n’offre pas Redis.
Vérifiez :
# 30 bad logins in a row: the last ones should be 429, not 401
for i in $(seq 1 30); do
curl -s -o /dev/null -w "%{http_code} " -X POST https://yourapp.ca/api/login \
-H 'content-type: application/json' -d '{"email":"a@b.c","password":"x"}'
done; echo8. Des journaux qui se fouillent, sans secrets dedans
Vous devez pouvoir répondre à « qu’est-il arrivé à cet utilisateur à 14 h 03? ». Journalisez une ligne par requête avec l’identifiant de l’utilisateur, et les erreurs avec leur pile.
Ne journalisez pas le corps des requêtes des routes d’authentification, les en-têtes Authorization ni les numéros de carte complets. Canner retire code, state, token, password, api_key et d’autres paramètres d’URL semblables de ses propres journaux de requêtes, mais ne touche pas à ce que votre appli écrit (lesquels).
Vérifiez : cherchez password, Bearer et sk_ dans vos journaux. Rien ne doit sortir.
9. Les bases de la Loi 25 pour les utilisateurs québécois
Si votre appli recueille des renseignements personnels auprès de personnes au Québec, la loi québécoise sur le secteur privé, modifiée par la Loi 25, s’applique à vous, qui que vous soyez. Voici les parties qui reviennent à l’équipe de l’appli. C’est notre lecture de la loi, pas un avis juridique.
| Article | Ce qu’il demande | Quoi faire dans l’appli |
|---|---|---|
| 3.1 † | Une personne responsable de la protection des renseignements personnels (par défaut, la personne ayant la plus haute autorité); son titre et ses coordonnées sont publiés sur votre site | L’ajouter à la page de confidentialité |
| 8.2 † | Une politique de confidentialité en termes simples et clairs, publiée sur votre site, quand vous recueillez des renseignements par un moyen technologique | La rédiger selon ce que l’appli recueille vraiment, la lier au pied de page et à l’inscription |
| 9.1 † | Les paramètres de confidentialité d’un produit offert au public assurent par défaut le plus haut niveau de confidentialité (sauf les témoins) | Partage facultatif, profils publics et suivi désactivés au départ |
| 3.5 et 3.8 † | Diminuer les risques après un incident de confidentialité, aviser avec diligence la Commission d’accès à l’information et les personnes concernées s’il y a un risque de préjudice sérieux, et tenir un registre des incidents | Ouvrir le registre maintenant; savoir qui décide et comment écrire aux utilisateurs touchés |
| 17 † | Avant de communiquer un renseignement personnel à l’extérieur du Québec, y compris à un fournisseur qui le conserve pour vous, évaluer les facteurs relatifs à la vie privée | Dresser la liste de chaque endroit où vont les données : hébergeur, base, courriel, analytique, et l’API d’IA qu’appellent vos fonctions |
† Les détails sur les concurrents proviennent des pages publiées par chaque fournisseur aux dates indiquées; les prix et forfaits changent, vérifiez auprès du fournisseur avant de décider. 3.1 (2026-10-29) · 8.2 (2026-10-29) · 9.1 (2026-10-29) · 3.5 et 3.8 (2026-10-29) · 17 (2026-10-29)
Questions
Ma clé anon ou publishable de Supabase est-elle un secret?
Non. Elle est faite pour le navigateur, et c’est la sécurité au niveau des lignes qui protège vos données. La clé secrète (service_role) contourne cette sécurité et ne doit jamais atteindre le navigateur.
Comment savoir si mon appli créée par IA expose des clés d’API?
Compilez-la comme en production et fouillez ce qui part au navigateur (.next/static, dist ou build) à la recherche de motifs comme sk_live_ et sk-, puis l’historique git. Changez toute clé trouvée, même après l’avoir retirée.
Faut-il une politique de confidentialité pour une petite appli?
Si vous recueillez des renseignements personnels auprès de personnes au Québec par un site ou une appli, l’article 8.2 de la loi sur le secteur privé demande une politique de confidentialité en termes simples et clairs, publiée sur votre site.
Puis-je garder Supabase et héberger l’appli chez Canner?
Oui. L’appli tourne chez Canner et continue d’appeler Supabase. Vos données restent alors où se trouve votre projet Supabase, ce qui compte pour l’article 17 si c’est hors Québec. Passer à Postgres Canner est facultatif.
À lire aussi
- GuideDéployer une appli Claude Code ou Cursor
- GuideRemplacer Supabase dans une appli Lovable
- GuideHébergez un artefact Claude sur votre domaine
- GuideOù héberger votre appli Bolt.new
- GuideDéployez votre appli v0 sans Vercel
- GuideSortez votre appli de Replit Deployments
Lancez-la à Montréal.
Gratuit pour commencer, avec Postgres, des sauvegardes qu’on peut tester et des journaux sur tous les forfaits. D’autres guides pour les applis créées par IA sont dans Héberger une appli créée par IA.