Chapitre 512 minDébutant
Vérifier une réponse d'IA et le code généré
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- vérifier un fait, une version ou une référence dans une source primaire ;
- relire et tester du code généré avant de l'adopter ;
- repérer les failles, les secrets et les paquets inventés d'un code généré ;
- appliquer une checklist de vérification.
3 exercices corrigés
Vérifier une réponse d'IA, c'est retrouver chaque fait qui compte dans une source primaire et tester chaque morceau de code avant de l'adopter. La règle tient en une phrase : l'IA propose, la source et le test décident. Ce chapitre te donne la méthode, les sources à consulter, la façon de relire et de tester du code généré, et une checklist à garder sous la main.
Ce qui se vérifie toujours
Tout ne mérite pas une vérification : une reformulation de ton propre texte ou une liste d'idées se jugent à la lecture. En revanche, vérifie systématiquement :
- les chiffres, dates et numéros de version ;
- les noms exacts de commandes, d'options, de fonctions, de paramètres et de paquets ;
- les références : identifiant CVE, article de loi, norme, guide, URL ;
- les citations attribuées à une personne ou à un document ;
- tout code que tu vas exécuter, intégrer ou montrer.
Les sources primaires
Une source primaire est celle qui fait autorité sur l'information : l'éditeur pour son logiciel, le législateur pour la loi. Un blog ou un forum peut te mettre sur la piste, pas trancher.
| Ce que tu vérifies | Source primaire |
|---|---|
| Syntaxe d'une commande Linux | man commande, commande --help, la documentation de la distribution |
| Cmdlet PowerShell | Get-Help NomDeLaCmdlet -Full, Microsoft Learn |
| Fonction d'un langage ou d'une bibliothèque | La documentation officielle : php.net, docs.python.org, MDN, la page du paquet |
| Version, fin de support | Les notes de version et la page de cycle de vie de l'éditeur |
| Faille de sécurité | cve.org, le bulletin de l'éditeur, les avis du CERT-FR |
| Texte juridique | Légifrance, EUR-Lex, le site de la CNIL |
| Règle d'examen du BTS | Le référentiel, l'arrêté de l'épreuve, la circulaire nationale |
Le cours Veille technologique détaille comment juger la fiabilité d'une source et recouper une information.
La méthode en quatre temps
- Repérer les affirmations vérifiables de la réponse. Surligne-les mentalement : « l'option
-Recurse», « depuis la version 8.4 », « l'article 32 du RGPD ». - Ouvrir la source. Pas la page citée par l'assistant sans la lire : la page elle-même, et le passage précis. Une source qui existe peut dire autre chose que ce que la réponse lui fait dire.
- Tester ce qui se teste : la commande dans une VM, la requête sur une base de test, le code avec ses tests.
- Décider : tu gardes, tu corriges ou tu écartes. Dans ta note ou ton code, cite la source primaire, pas l'assistant.
Relire du code généré
Un code généré se relit comme le code d'un collègue que tu ne connais pas, avec un soupçon de plus : il a l'air propre même quand il est faux. Pose-toi ces questions, dans l'ordre.
- Est-ce que je comprends chaque ligne ? Si non, demande l'explication de la ligne, puis vérifie-la dans la documentation. Tu ne livres pas une ligne que tu ne saurais pas expliquer à l'oral de l'E6.
- Fait-il ce qui était demandé, et seulement cela ? Un code généré ajoute parfois une fonction, modifie un comportement voisin ou supprime une vérification « pour simplifier ».
- Que se passe-t-il dans les cas limites ? Une liste vide, une valeur
NULL, un fichier absent, un accent dans un nom, une coupure réseau. - Les erreurs sont-elles traitées ? Méfie-toi d'un
tryqui avale toutes les exceptions sans rien dire. - Est-il sûr ? Voir la section suivante.
- Les dépendances existent-elles, et sont-elles saines ? Voir les paquets inventés.
Le TP Coder avec l'IA : Claude & Artifacts te fait relire le HTML et le CSS produits par un assistant et y repérer les erreurs.
Tester avant d'adopter
- Dans un environnement de test : une VM avec un instantané, une base de test, une branche Git. Jamais directement en production.
- Avec des tests automatisés : écris toi-même au moins un test du cas nominal et un test d'un cas limite avant de demander le code, puis fais-les passer. Le cours Tests montre comment.
- À blanc d'abord pour un script d'administration :
-WhatIfen PowerShell, une option--dry-runquand elle existe, ou unechodevant les commandes destructrices. - Avec le moins de droits possible : n'exécute jamais en administrateur un script que tu n'as pas lu.
Les failles du code généré
Le code généré n'est pas sûr par défaut. En octobre 2026, l'éditeur Veracode a fait écrire du code à 18 modèles sur des tâches de test, en Python, C#, JavaScript et Java : 38 % du code produit contenait encore une faille, et sur les tâches exposées au XSS, seulement 18 % du code était protégé. Les failles qui reviennent le plus :
| Faille | Ce que tu vois dans le code | Correction |
|---|---|---|
| Injection SQL | Une requête construite en collant une saisie (f"... WHERE nom = '{nom}'", concaténation PHP) | Requête préparée (sécurité applicative) |
| XSS | Une saisie insérée avec innerHTML ou affichée sans échappement | textContent, htmlspecialchars(), échappement du moteur de gabarits (faille XSS) |
| Secret dans le code | Un mot de passe, une clé d'API ou un jeton écrits en clair | Variable d'environnement, coffre de secrets (configuration et secrets) |
| Contrôle d'accès absent | Une route qui modifie une donnée sans vérifier qui appelle | Vérification des droits côté serveur, sur chaque route |
| Cryptographie faible | md5() ou sha1() pour des mots de passe | password_hash(), argon2 ou bcrypt |
| Compte trop puissant | Connexion à la base avec root | Compte applicatif aux droits minimaux |
Les paquets inventés
Un assistant peut proposer d'installer une bibliothèque qui n'existe pas : le nom est plausible, il ressemble à de vrais paquets. Des chercheurs ont mesuré le phénomène sur 576 000 exemples de code Python et JavaScript générés par 16 modèles (Spracklen et al., USENIX Security 2025) : en moyenne, au moins 5,2 % des paquets cités par les modèles commerciaux n'existaient pas, et 21,7 % pour les modèles ouverts testés, soit 205 474 noms de paquets inventés différents. Comme les mêmes noms inventés reviennent d'une requête à l'autre, un attaquant peut publier un paquet malveillant sous l'un de ces noms et attendre que quelqu'un l'installe : on parle de slopsquatting.
Avant d'installer un paquet proposé par une IA :
- cherche-le sur le registre officiel (npmjs.com, pypi.org, packagist.org) et vérifie que le nom est exactement le même ;
- regarde l'éditeur, la date de création, le nombre de téléchargements et le dépôt de code associé : un paquet créé la semaine dernière, sans dépôt, n'inspire pas confiance ;
- préfère la bibliothèque recommandée par la documentation officielle du langage ou du framework ;
- verrouille les versions (
package-lock.json,composer.lock) et fais analyser tes dépendances (chaîne d'approvisionnement).
Licences et provenance du code
Un modèle a appris sur du code public, dont une partie est sous licence. Il peut reproduire un extrait existant presque mot pour mot, sans en indiquer l'origine ni la licence. Certains outils signalent ces correspondances ; quand c'est le cas, lis la licence avant de garder l'extrait (licences logicielles). Pour ton portfolio, indique ce qui a été écrit avec une IA : le chapitre 13 y revient.
La checklist
Exercices
Exercice 1 sur 3 Relire un code généré Réussi À revoir
Chloé a demandé une fonction Python qui renvoie les tickets d'un demandeur. L'assistant a produit ce code. Relève au moins quatre problèmes, puis propose une version corrigée.
import mysql.connector
def tickets_du_demandeur(nom):
cnx = mysql.connector.connect(host="192.168.10.179", user="root",
password="Sorbier2026!", database="parc")
cur = cnx.cursor()
cur.execute(f"SELECT t.id_ticket, t.titre FROM ticket t "
f"JOIN employe e ON e.id_employe = t.id_demandeur "
f"WHERE e.nom = '{nom}'")
try:
return cur.fetchall()
except:
pass
Voir la réponseMasquer la réponse de l'exercice 1
Les problèmes :
- Injection SQL : la saisie
nomest collée dans la requête avec une f-string. Un nom contenant une apostrophe casse la requête, et une saisie malveillante peut la détourner. - Secret dans le code : le mot de passe est écrit en clair ; il finira dans Git.
- Compte
root: une fonction de lecture n'a besoin que d'un compte applicatif autorisé à lireticketetemploye. - Erreurs avalées : le
except: passrenvoieNonesans rien dire, et l'erreur probable (la connexion) se produit avant letry. - Connexion jamais fermée : chaque appel laisse une connexion ouverte.
Une version corrigée :
import os
import mysql.connector
def tickets_du_demandeur(nom):
cnx = mysql.connector.connect(
host=os.environ["PARC_DB_HOST"],
user=os.environ["PARC_DB_USER"], # compte applicatif en lecture seule
password=os.environ["PARC_DB_PASSWORD"],
database="parc",
)
try:
cur = cnx.cursor()
cur.execute(
"SELECT t.id_ticket, t.titre FROM ticket t "
"JOIN employe e ON e.id_employe = t.id_demandeur "
"WHERE e.nom = %s",
(nom,),
)
return cur.fetchall()
finally:
cnx.close()
Le %s est le marqueur de paramètre de mysql.connector : la valeur part séparément de la requête et ne peut pas devenir du SQL. Une erreur de connexion ou de requête remonte maintenant à l'appelant, qui peut l'afficher ou la journaliser.
Tu avais trouvé ?
Exercice 2 sur 3 Vérifier une réponse Réussi À revoir
Un assistant sans recherche Web a répondu à Moussa : « Pour ton nouveau serveur, installe MySQL 8.0 : c'est la version LTS recommandée et elle est maintenue jusqu'en 2030. Lance ensuite mysql_secure_installation --enable-tls pour activer le chiffrement. »
- Quelles affirmations faut-il vérifier ?
- Où ?
- Que sais-tu déjà grâce au cours SQL ?
Voir la réponseMasquer la réponse de l'exercice 2
- Trois affirmations : « MySQL 8.0 est la version LTS recommandée », « maintenue jusqu'en 2030 », et l'existence de l'option
--enable-tlsdemysql_secure_installation. - Sur le site de MySQL : la page des versions et du cycle de vie, et la documentation de
mysql_secure_installation, oumysql_secure_installation --helpsur une machine de test. - Le cours SQL indique que la version LTS de référence est MySQL 8.4 et que MySQL 8.0 n'est plus maintenu depuis avril 2026 : la réponse est périmée, sans doute à cause de la date de coupure du modèle. L'option, elle, doit être cherchée dans l'aide de la commande : si elle n'y figure pas, elle est inventée. Moussa ne garde rien de cette réponse sans vérification.
Tu avais trouvé ?
Exercice 3 sur 3 Un paquet suspect Réussi À revoir
Pour lire un fichier Excel en Node.js, un assistant propose npm install excel-reader-fast-pro. Décris les vérifications que tu fais avant de l'installer, et ce que tu fais si le paquet n'existe pas.
Voir la réponseMasquer la réponse de l'exercice 3
Avant d'installer :
- chercher le nom exact sur npmjs.com ;
- s'il existe : regarder l'éditeur, la date de première publication, le nombre de téléchargements hebdomadaires, le lien vers le dépôt de code, les problèmes ouverts, et les scripts lancés à l'installation (
postinstall) ; - comparer avec les bibliothèques citées par la documentation ou largement utilisées pour ce besoin.
S'il n'existe pas, c'est une hallucination : ne crée surtout pas un paquet de ce nom par curiosité, et ne réessaie pas plus tard « au cas où » : un attaquant a pu le publier entre-temps. Redemande une solution en précisant « avec une bibliothèque existante et maintenue, dont tu donnes la page npm », puis vérifie cette page.
Tu avais trouvé ?