Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

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érifiesSource primaire
Syntaxe d'une commande Linuxman commande, commande --help, la documentation de la distribution
Cmdlet PowerShellGet-Help NomDeLaCmdlet -Full, Microsoft Learn
Fonction d'un langage ou d'une bibliothèqueLa documentation officielle : php.net, docs.python.org, MDN, la page du paquet
Version, fin de supportLes 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 juridiqueLégifrance, EUR-Lex, le site de la CNIL
Règle d'examen du BTSLe 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

  1. 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 ».
  2. 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.
  3. Tester ce qui se teste : la commande dans une VM, la requête sur une base de test, le code avec ses tests.
  4. 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.

  1. 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.
  2. 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 ».
  3. 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.
  4. Les erreurs sont-elles traitées ? Méfie-toi d'un try qui avale toutes les exceptions sans rien dire.
  5. Est-il sûr ? Voir la section suivante.
  6. 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 : -WhatIf en PowerShell, une option --dry-run quand elle existe, ou un echo devant 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 :

FailleCe que tu vois dans le codeCorrection
Injection SQLUne requête construite en collant une saisie (f"... WHERE nom = '{nom}'", concaténation PHP)Requête préparée (sécurité applicative)
XSSUne saisie insérée avec innerHTML ou affichée sans échappementtextContent, htmlspecialchars(), échappement du moteur de gabarits (faille XSS)
Secret dans le codeUn mot de passe, une clé d'API ou un jeton écrits en clairVariable d'environnement, coffre de secrets (configuration et secrets)
Contrôle d'accès absentUne route qui modifie une donnée sans vérifier qui appelleVérification des droits côté serveur, sur chaque route
Cryptographie faiblemd5() ou sha1() pour des mots de passepassword_hash(), argon2 ou bcrypt
Compte trop puissantConnexion à la base avec rootCompte 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 :

  1. cherche-le sur le registre officiel (npmjs.com, pypi.org, packagist.org) et vérifie que le nom est exactement le même ;
  2. 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 ;
  3. préfère la bibliothèque recommandée par la documentation officielle du langage ou du framework ;
  4. 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.

python
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 :

  1. Injection SQL : la saisie nom est 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.
  2. Secret dans le code : le mot de passe est écrit en clair ; il finira dans Git.
  3. Compte root : une fonction de lecture n'a besoin que d'un compte applicatif autorisé à lire ticket et employe.
  4. Erreurs avalées : le except: pass renvoie None sans rien dire, et l'erreur probable (la connexion) se produit avant le try.
  5. Connexion jamais fermée : chaque appel laisse une connexion ouverte.

Une version corrigée :

python
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. »

  1. Quelles affirmations faut-il vérifier ?
  2. Où ?
  3. Que sais-tu déjà grâce au cours SQL ?
Voir la réponseMasquer la réponse de l'exercice 2
  1. Trois affirmations : « MySQL 8.0 est la version LTS recommandée », « maintenue jusqu'en 2030 », et l'existence de l'option --enable-tls de mysql_secure_installation.
  2. Sur le site de MySQL : la page des versions et du cycle de vie, et la documentation de mysql_secure_installation, ou mysql_secure_installation --help sur une machine de test.
  3. 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 :

  1. chercher le nom exact sur npmjs.com ;
  2. 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) ;
  3. 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é ?

Chapitre terminé !

Fais les 3 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Assistants de code et agents IARevoir le sommaire du cours