Bases HTML-CSS-Javascript

Objectifs de l’activité :

  • langage de description HTML

  • feuille de style CSS

  • langage Javascript

  • Manipulation du Document Object Model

Mise en situation

On désire réaliser une page web qui liste une série de vulnérabilités de sécurité.

Chacune des vulnérabilités listées doit mentionner :

  • Son identifiant CVE.

    CVE

    CVE (Common Vulnerabilities and Exposures) est un catalogue qui référence depuis 1999 l’ensemble des failles de sécurité informatique avec :

    • un identifiant sous la forme CVE-année-numéro,

    • les produits concernés

    • une description

    • un score de sévérité (→ CVSS : Common Vulnérability Scoring System) compris entre 0(faible) et 10(maximale).

    Ce dictionnaire était maintenu par l’organisme MITRE jusqu’à ce que son financement par le gouvernement américain cesse le 16 avril 2025.

    Une alternative européenne — via son agence de cybersécurité, l'ENISA — est en train d’émerger. Elle est accessible sur European Union Vulnerability Database link.

  • Le produit affecté ainsi que son fournisseur

  • Le type du produit affecté (OS, Matériel, Application)

  • Le type de vulnérabilité (Injection SQL, XXX, CSRF, Path Traversal …​)

  • Une courte description

💻 Travail n° 1 HTML

Ce travail consiste à ajouter quelques éléments HTML dans une page web dont le code partiel est fourni pour arriver au résultat suivant :

html complete

Vérifier la prise en compte de chaque modification demandée par un aperçu de la page web dans un navigateur web.

Ressources utiles :

🎯 Travail à faire :

  1. On vous donne le code HTML partiel de cette page web dans dummy-vulns.html.
    Le télécharger sur votre poste de travail, l’ouvrir dans un navigateur pour avoir un aperçu de la page web et analyser son contenu dans un éditeur de texte.

  2. Ajouter un titre de niveau 1 à la page web pour obtenir le rendu suivant. Noter que “(fictif)” est en gras et emphase.

    Registre (fictif) de Vulnérabilités de Sécurité

  3. Modifier le fichier HTML pour ajouter la vulnérabilité suivante dans la liste :

    id CVE

    CVE-2024-1408

    Fournisseur

    Apache

    Produit

    Log4j v2.x

    Type

    Application

    Vulnérabilité

    RCE

    CVSS

    10.0

    Description

    Exécution de code à distance via la journalisation de chaînes JNDI.

  4. Déplacer le titre de la page dans un élément générique de type bloc (→ <div>…​</div>) auquel vous attribuerez la classe (→ class=…​) “title-bar”

  5. Ajouter dans ce bloc, à la suite du titre, un bouton (→ <button>…​</button>) intitulé “Mode sombre” auquel vous attribuerez l'identifiant (→ id=…​) “darkModeBtn”

  6. Ajouter — entre le bloc “title-bar” et le tableau qui liste les CVEs — un élément générique de type bloc (→ <div>…​</div>) auquel vous attribuerez la classe (→ class=…​) “filters”.

  7. Insérer successivement dans ce bloc générique :

    • un label (→ <label>…​</label>) dont l’intitulé est “Filtrer par Type de Produit :”

    • 4 boutons (→ <button>…​</button>) intitulés “Tous”, “OS”, “Matériel”, “Application” auxquels vous attribuerez respectivement les identifiants (→ id=…​) “allBtn”, “osBtn”, “hwBtn”, “appBtn”

💻 Travail n° 2 CSS

Ce travail consiste à modifier/ajouter quelques règles CSS pour styliser la page web.

Vérifier la prise en compte de chaque modification demandée par un aperçu de la page web dans un navigateur web.

Ressources utiles :

🎯 Travail à faire :

  1. Créer un sous-répertoire css/ dans le répertoire où se trouve dummy-vulns-statiç.html puis y sauvegarder la feuille de style dummy-vulns.css fournie.

    [...]
    |   dummy-vulns.html
    \---css
            dummy-vulns.css
  2. Lier cette feuille de style à notre page web (→ <link …​ />) et vérifier sa prise en compte par le navigateur web

  3. Ajouter, dans la règle CSS qui s’applique à l’entête de la table (→ <th>), les déclarations CSS (c.-à-d. les paires propriété/valeur) qui permetteront de lui appliquer :

    • une couleur de 1er plan (→ color) valant “white”

    • une couleur d’arrière-plan (→ background) avec les composantes Rouge, Vert, Bleu suivantes : (44, 62, 80)

  4. Ajouter une nouvelle règle qui s’applique aux éléments HTML dont la classe est cvss pour qu’ils s’affichent en gras avec la couleur de 1erplan RGB(255,25,0)

    • Voir Sélecteurs de classe link pour savoir comment cibler une classe d’éléments HTML.

    • Pour savoir quelle propriété CSS correspond à “gras”, rechercher “mdn css gras” dans Google.

  5. Ajouter une règle qui cible tous les éléments <td> ayant la classe “idCVE” — et seulement eux — pour les afficher en gras avec une couleur de teinte/saturation/luminosité HSL(210deg,94%,46%)

  6. Ajouter une règle qui cible tous les éléments <tr> de pseudo-classe :hover — et seulement eux — qui permettra d’appliquer la couleur hexadécimale 0xf3f3f3 lors du survol de chaque ligne du tableau avec la souris.

    Voir :hover link pour plus d’explication sur la pseudo-classe :hover.

  7. Modifier le fichier HTML de façon à appliquer en plus de la règle .badge, les règles .OS, .Hardware et Application déjà présentes dans le fichier CSS de façon à appliquer une couleur différente à chaque type de “badge” (c.-à-d. OS, Hardware ou Application).

    css badge color
    Résultat attendu
  8. Créer une règle CSS s’appliquant à tous les éléments de classe “filters” avec les propriétés suivantes :

       margin-bottom: 20px;
       display: flex;
       gap: 15px;
       align-items: center;
       background: #e8ecef;
       padding: 15px;
       border-radius: 5px;
  9. Créer une règle CSS s’appliquant à tous les boutons présents dans le bloc de classe “filters” avec les propriétés suivantes :

       padding: 8px;
       border: 1px solid #ccc;
       border-radius: 4px;
       background: #3498db;
       color: white;
       cursor: pointer;
       border: none;
       font-weight: bold;
    css filters div
    Résultat attendu suite aux 2 dernières questions
  10. Créer une règle CSS s’appliquant spécifiquement au bouton dont l’identifiant est “darkModeBtn” avec les propriétés suivantes :

       background: #899fad;
       color: white;
       font-weight: bold;
  11. Faire une copie du fichier de style dummy-vuln.css dans dummy-vuln-dark.css et modifier les règles body, container, .filters et tr:hover pour appliquer un thème sombre de votre convenance à la page web.

  12. Lier ce nouveau fichier de style à la page web et modifier l’intitulé du bouton d’identifiant “darkModeBtn” pour obtenir un résultat équivalent à l’illustration suivante :

    css dark theme
    Exemple de résultat attendu

💻 Travail n° 3 Javascript : le côté obscur 🥷

Ce travail consiste à ajouter du code Javascript à la page web pour appliquer le thème sombre ou clair à la page web suite à l’appui du bouton correspondant.

Ressources utiles :

🎯 Travail à faire :

  1. Créer un sous-répertoire js/ dans le répertoire où se trouve dummy-vulns.html puis y ajouter un nouveau fichier dummy-vulns.js

    […]
    |   dummy-vulns.html
    |
    +---css
    |       dummy-vulns.css
    |       dummy-vuln-dark.css
    |
    \---js
            dummy-vulns.js
  2. Lier ce fichier à notre page web en ajoutant la balise suivante dans l’entête HTML :

    <script src="dummy-vulns.js" defer></script> (1)
    1 defer permet de spécifier au navigateur de n’exécuter le script qu’après chargement et analyse syntaxique du fichier HTML.
  3. Modifier les fichiers dummy-vulns.css et dummy-vuln.js en adaptant les instructions des étapes 2 et 3 de l’article Enabling Dark and Light mode in JavaScript – a guide link pour faire en sorte de basculer alternativement du thème clair au thème sombre lorsqu’on appuie sur le bouton d’identifiant “darkModeBtn” présent dans notre page web.
    Voir après l’illustration une façon de procéder.

    js toggle theme

    Le travail peut se décomposer comme suit :

    1. Dans la feuille de style, dupliquer les styles de body, filters, container et tr:hover de façon à les adapter à un thème clair et à un thème sombre :

      body { (1)
         ...
      }
      
      body.dark-mode { (2)
         ...
      }
      
      .container { (1)
        ...
      }
      
      .container.dark-mode { (2)
        ...
      }
      
      ...
      1 règle pour le thème clair
      2 règle pour le thème sombre
    2. Dans le script Javascript, ajouter un “Event Listener” à l’évènement “click” du bouton dont l’identifiant est “darkModeBtn”.

    3. Coder l’algorithme suivant dans l'event listerner :

      Basculer la classe "`dark-mode`" sur l'élément HTML `body` (1)
      Basculer la classe "`dark-mode`" sur l'élément HTML dont la classe est `container` (1)
      Basculer la classe "`dark-mode`" sur l'élément HTML dont la classe est `filters` (1)
      Basculer la classe "`dark-mode`" sur tous les éléments HTML de type `<tr>` (1)
      SI la liste des classes de l'élement `body` contient "`dark-mode`" ALORS (1)
      | Changer l'intitulé du bouton en "`Mode clair`" (2)
      SINON
      | Changer l'intitulé du bouton en "`Mode sombre`"
      FINSI
      1 Voir element.classlist link et sa méthode toggle()
      2 Voir element.textContent link
      • Cibler l’élément “body” en Javascript se fait directement avec document.body.

      • Un élément possédant une classe “dummy” pourra être ciblé avec document.querySelector('.dummy')

      • Pour cibler tous les éléments de type <tr>, on peut utiliser document.querySelectorAll("tr")

      • On peut appliquer exécuter un code pour chacun des éléments d’un tableau retourné par querySelectorAll() avec la méthode forEach(). Voir Array : méthode forEach() link

💻 Travail n° 4 Javascript : Filtrage

Ce travail consiste enfin à filtrer les CVEs selon le type du produit affecté : OS, Matériel, Application, Tous.

js filter

🎯 Travail à faire :

  1. Coder une fonction Javascript :

    function filterTable(filterType) { (1)
      ...
    }
    1 filterType ∈ ['all', 'OS', 'Hardware', 'Application']

    Son algorithme est le suivant :

    Sélectionner toutes les lignes du tableau (-> balises `<tr>`) (1)
    POUR CHAQUE ligne FAIRE (2)
    | Sélectionner l'élément de cette ligne ayant la classe "`badge`" (3)
    | SI le type de filtrage est "`Tous`" (4)
    | |  OU une des classes de l'élément correspond au paramètre `filterType` ALORS
    | | Forcer le style de l'affichage sur "`table-row`" (5)
    | SINON
    | | Forcer le style de l'affichage sur "`none`"
    FINPOUR
  2. Attribuer un event listener à chaque bouton de filtrage dont le rôle est d’appeler la fonction filterTable() avec le paramètre adéquat.

🞄  🞄  🞄