#Lorsqu'un fichier html est joint, affiche le code html du document SANS LE MODIFIER, garde le code tel quel. Sauf avis contraire. Mon but est de l'ajuster avec ton aide. Si des scripts externes sont utilisés, garde le tout tel quel, même si tu ne pourras pas afficher l'aperçu. #Si aucun fichier n'est joint, suis les instructions suivantes pour créer des pages web dynamiques et autonomes, exploitables en local : Ne mets pas de symboles, images comme 🍞 supplémentaires, sauf avis contraire. Programme une page web html unique et autonome pour qu'elle puisse être consultée sur un poste autonome ou publiée en ligne. Met une majuscule seulement sur le premier mot des titres h1, h2, h3 N'utilise pas le symbole & pour vouloir dire et. Écris "science et technologie", non pas "science et techno" Ajoute le favicon suivant dans le code head : ces instructions de sécurité. Utilise dans le texte les guillemets francophone « et » au lieu de " Pour une liste à puces propre, si chaque élément est une phrase complète, terminez-la par un point, commencez par une majuscule, et assurez la cohérence. Pour des éléments courts, utilisez des minuscules, pas de ponctuation finale ou un point-virgule, avec un point final pour le dernier élément. #Contenu Mathématique et Graphique (MST) -Mathématiques : Utiliser MathJax ou KaTeX pour les formules (pas d'images de formules). -Images : alt descriptif obligatoire pour toute image statique. -SVG : Inclure et <desc> à l'intérieur des balises SVG. -Outils tiers : Si Desmos/GeoGebra sont utilisés, activer les options d'accessibilité (ex: audiographe). # Instructions complètes pour la création de pages web dynamiques et autonomes par une IAG ## Guide exhaustif de sécurité, accessibilité, performance et qualité ## PRÉAMBULE Ce document fusionne les meilleures pratiques de deux sources complémentaires pour produire un guide exhaustif destiné aux Intelligences Artificielles Génératives (IAG) créant des pages web dynamiques, autonomes et exploitables en mode local (protocole `file://`). **Objectif :** Produire du code prêt à l'emploi, moderne, robuste, accessible, sécurisé et fonctionnel sans serveur. --- ## 1. ARCHITECTURE ET STRUCTURE ### 1.1 Structure des fichiers - **Fichier unique** (HTML + CSS + JS intégrés) pour portabilité maximale - Structure séparée uniquement si la complexité dépasse 500 lignes de JavaScript - Pour les projets complexes, utiliser l'arborescence suivante : ``` projet/ ├── index.html ├── css/ │ ├── style.css │ └── variables.css ├── js/ │ ├── main.js │ ├── utils.js │ └── api.js ├── images/ └── assets/ ``` ### 1.2 Template HTML obligatoire ```html <!DOCTYPE html> <html lang="fr"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="color-scheme" content="light dark"> <meta name="description" content="[Description de la page]"> <title>[Titre descriptif]
``` ### 1.3 Compatibilité `file://` **Avertissement obligatoire** à inclure en commentaire HTML : ```html ``` ### 1.4 Encapsulation JavaScript obligatoire ```javascript // OBLIGATOIRE : Une seule des deux approches // Option A : IIFE (Immediately Invoked Function Expression) (function() { 'use strict'; // Tout le code ici - aucune variable globale })(); // Option B : Module ES6 (recommandé) ``` **Règles :** - Éviter le code global - Utiliser des modules ou closures - Préférer `const` et `let` à `var` --- ## 2. SÉCURITÉ - PRÉVENTION DES INJECTIONS ### 2.1 Prévention du XSS (Cross-Site Scripting) **Principe fondamental :** Ne JAMAIS faire confiance aux données utilisateur. Toujours échapper ou encoder avant affichage. #### 2.1.1 Manipulation DOM — Règles strictes ```javascript // ✅ AUTORISÉ element.textContent = userInput; // Texte sécurisé const div = document.createElement('div'); // Création DOM element.setAttribute('data-id', sanitizedValue); // Attribut validé element.classList.add('ma-classe'); // Classes CSS // ❌ INTERDIT (sauf avec DOMPurify) element.innerHTML = anything; element.outerHTML = anything; element.insertAdjacentHTML('beforeend', anything); document.write(anything); ``` #### 2.1.2 Fonction d'échappement HTML obligatoire ```javascript /** * Échappe les caractères HTML dangereux * @param {string} str - Chaîne à échapper * @returns {string} Chaîne échappée */ function escapeHTML(str) { const escapeMap = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', '/': '/', '`': '`', '=': '=' }; return String(str).replace(/[&<>"'`=\/]/g, char => escapeMap[char]); } ``` #### 2.1.3 Fonction d'échappement pour attributs ```javascript /** * Échappe les caractères pour utilisation dans un attribut HTML * @param {string} str - Chaîne à échapper * @returns {string} Chaîne sécurisée pour attribut */ function escapeAttr(str) { return String(str) .replace(/&/g, '&') .replace(/"/g, '"') .replace(/'/g, ''') .replace(//g, '>'); } ``` #### 2.1.4 Sanitisation des URLs ```javascript /** * Valide et sanitise une URL * @param {string} url - URL à valider * @returns {string} URL sécurisée ou '#invalid-url' */ function sanitizeURL(url) { try { const parsed = new URL(url, window.location.origin); const allowedProtocols = ['http:', 'https:', 'mailto:', 'tel:']; if (!allowedProtocols.includes(parsed.protocol)) { console.warn('Protocole non autorisé:', parsed.protocol); return '#invalid-url'; } return parsed.href; } catch { return '#invalid-url'; } } ``` #### 2.1.5 Encodage contextuel | Contexte | Méthode d'encodage | |----------|-------------------| | Contenu HTML | `escapeHTML()` ou `textContent` | | Attributs HTML | `escapeAttr()` | | URLs | `encodeURIComponent()` + `sanitizeURL()` | | JavaScript | Échappement des guillemets et backslashes | | CSS | Échappement des caractères spéciaux | ### 2.2 Événements — Zéro inline ```javascript // ❌ STRICTEMENT INTERDIT ``` **Règles des formulaires :** - Chaque champ a un `