Introduction à l'informatique

Cours 9

kn@lri.fr
http://www.lri.fr/~kn

Internet et ses services

Bref historique d'Internet (1/2)

1959-1968 ARPA (Advanced Research Project Agency) crée un réseau de quelques machines capable de résister à une attaque.
1969 ARPANET. Interconnexion des ordinateurs centraux des grandes universités et institutions américaines. Première utilisation du concept de paquet d'information.
1970-1982 Interconnexion avec la Norvège et le Royaume-Uni.
1982 Généralisation du protocole TCP/IP. Naissance de l'Internet actuel.

Bref historique d'Internet (2/2)

1986 « Autoroutes de l'information ». Des super-ordinateurs et les premières connexions à fibres optiques sont utilisées pour accélérer le débit d'Internet.
1987-1992 Apparition des premiers fournisseurs d'accès. Les entreprises se connectent.
1993-2000 Avènement du Web. Démocratisation du haut débit (vers 2000 pour la France).
2000-? Explosion des services en ligne, arrivée des réseaux sociaux, internet mobile, Cloud (stockage et calcul mutualisés accessible depuis internet).

Internet

Démo

On établit une connexion TCP, sur le port 4444 entre notre machine et la machine dont l'IP est 127.0.0.1.

La commande Unix netcat possède deux mode de fonctionnement :

World Wide Web (1/2)

World Wide Web (2/2)

Concepts clé:

URL localisation d'une page Web (« adresse de la page »)
HTTP protocole de communication entre un client et un serveur Web
HTML langage de description des pages Web

Évolutions récentes (Web 2.0, internet mobile, Cloud, …)

Fonctionnement du Web

Fonctionnement du Web

Côté client

Le navigateur :

Côté serveur

Adressage des documents Web (1/3)

URL Uniform Resource Locator identifie un document sur internet

Une URL se décompose en 3 parties

Syntaxe (simplifiée) :

protocole://adresse/document

Exemple :

http://www.lri.fr/~kn/teach_fr.html

Adressage des documents Web (2/3)

On peut aussi préciser un numéro de port, des paramètres et un emplacement :

protocole://adresse:port/document?p1=v1&p2=v2#empl

Exemple :

http://www.youtube.com:80/results?search_query=cat#search-results

Le serveur utilise les paramètres passés par le client dans l'URL pour calculer le contenu de la page (changer la chaîne « cat » ci-dessus et essayer)

Adressage des documents Web (3/3)

La racine d'un site Web (ex: http://www.lri.fr/) correspond à un répertoire sur le disque du serveur (ex: /var/www). Le fichier

http://www.lri.fr/index.html

se trouve à l'emplacement

/var/www/index.html

Le serveur Web peut aussi effectuer des réécritures d'adresses :

http://www.lri.fr/~kn/index.html

devient

/home/kn/public_html/index.html

Caractéristiques du protocole HTTP

Format des messages HTTP

Les messages ont la forme suivante

Démo

Détail sur HTTP

Sécurité du Web

Éléments de cryptographie (1)

Alice et Bob veulent échanger des données confidentielles.

  1. 1. Chiffrement symétrique:
    • Ils se mettent d'accord sur une clé commune
    • Alice chiffre son message avec la clé et l'envoie à Bob
    • Bob déchiffre le message avec la clé


    Non sûr (Alice et Bob doivent se mettre d'accord sur une clé en « clair », par email par exemple) ou non pratique (ils doivent se rencontrer physiquement pour échanger la clé).

    Efficace: on peut implanter plusieurs algorithmes de chiffrements en utilisant uniquement des opérations logiques de bases (AND, OR, XOR). Il est facile de les implanter sur des puces dédiées (cartes de crédit, processeurs mobiles). Ils sont « sûrs » tant que la clé reste secrète.

Éléments de cryptographie (2)

Alice et Bob veulent échanger des données confidentielles.

  1. 2.  Chiffrement asymétrique:
    • Bob crée une clé publique KBpub et une clé secrète KBpriv, telle que
      msg, KBpriv(KBpub(msg)) = KBpub(KBpriv(msg)) = msg

      Bob diffuse sa clé publique (sur sa page Web par exemple, ou dans un annuaire de clé) et garde sa clé privée secrète.
    • Alice chiffre son message m avec la clé publique de Bob (KBpub(m)) et l'envoie à Bob
    • Bob déchiffre le message avec sa clé privée: KBpriv(KBpub(m))=m

    Sûr et pratique
    Peu efficace: repose sur des problèmes mathématiques difficiles. Chiffrer et déchiffrer un message n'est pas réaliste pour des grands messages (vidéo en streaming, requêtes Web, …).

Éléments de cryptographie (3)

On combine les deux méthodes. (Alice envoie un message à Bob)

Ceci est à la base de protocoles tels que HTTPS

Éléments de cryptographie (4)

Le chiffrement asymétrique permet aussi d'avoir la preuve que quelqu'un est bien Bob!

Comment garantir que la personne qui a généré les clés au départ est bien Bob ?

Une analogie

La cryptographie asymétrique fonctionne exactement comme l'analogie de la boîte aux lettres. Pourquoi ?

HTTP: protocole texte « en clair »

HTTP est un protocole texte, les données ne sont pas chiffrées et sans identification

Espionnage de connexion

Alice représente le client, Bob le serveur et Eve (Eavesdropper) l'attaquante

On suppose que Eve est root sur la machine. Il suffit de lire les paquets qui transitent par la carte réseau (tcpdump sous Linux).

Ce problème touche tous les protocoles en clair: HTTP, POP, IMAP, FTP, …. Il peut être résolu grâce au chiffrement de toute la connexion.

Attaque Man in the middle

Mallory se place entre Alice (cliente) et Bob (banque), par exemple au moyen d'un e-mail frauduleux en HTML:

  1. L'émail contient:
  2. Alice, insouciante, clique sur le lien

    A M B
  3. Mallory peut retransmettre les requêtes entre Bob et Alice, en les modifiant au passage. Le problème est causé par un manque d'authentification (Mallory n'a pas a prouver à Alice qu'il est Bob)

Solution: HTTPS

HTTP Secure

  1. Respose sur de la cryptographie asymétrique (pour l'authentification et le partage de clé) et symétrique (pour le chiffrement de connexion)
  2. Permet d'authentifier les correspondants et de protéger les données
  3. Suppose l'existence de tiers de confiance Alice et Bob font confiance à Trent (Trusted Third Party)

Bob possède des clés publiques et privées (KBpub et KBpriv), Trent possède des clés publiques et privées (KTpub et KTpriv)

HTTPS (détail du protocole)

Bob et Trent se rencontrent. Trent signe la clé publique de Bob en calculant

SB=KTpriv(KBpub)
Comme Trent utilise sa clé privée on sait que seul Trent a pu générer cette signature. De plus, Trent a rencontré Bob donc il certifie que la clé KBpub appartient bien à quelqu'un nommé Bob.

  1. Alice (client) veut se connecter à Bob. Bob fournit sa clé publique KBpub et la signature SB
  2. Alice contacte Trent (en qui elle a confiance) et récupère sa clé publique KTpub. Elle déchiffre la signature: KTpub(SB) et vérifie qu'elle retombe bien sur la clé publique de Bob.
  3. Elle peut alors choisir une clé symétrique, la chiffrer avec KBpub et entamer une communication chiffrée et authentifiée avec Bob.

Tiers de confiance

Les tiers de confiance sont des entités (états, associations, compagnies privées) qui se chargent de vérifier les clés publiques d'autres entités. C'est une vérification physique (documents administratifs, …).

ssl

Cette erreur s'affiche quand une signature n'est pas conforme ou n'a pas pu être vérifiée

Tiers de confiance

Attaques contre les authorités de certifications (tiers de confiance): difficiles, mais pas impossible. Certains tiers de confiance sont douteux (états voyous, compagnie piratées dont les clés privées sont compromises,…)
Attaques d'implémentation (plus probables) : on exploite un bug dans le code des serveurs web ou des navigateurs
Autres faiblesses: HTTPS est en « haut » dans la pile IP (application). On peut donc avoir connaissance du nombre de paquet échangés, des adresses IP des participants, la taille et la fréquence des paquets… (même si on n'en connaît pas le contenu). Cela permet certaines attaques statistiques ou de déni de service (DoS).

Cookies et sessions

Stateless

Le protocole HTTP est un protocole sans état. Lorsque le serveur ferme une connexion TCP après avoir envoyé sa réponse, il « oublie » le client (i.e. rien dans le protoocle n'indique de conserver un historique des requêtes).

Exemple

Problème Aucun mécanisme dans HTTP (ou dans TCP ou IP) ne permet d'identifier de façon exacte le client, i.e. l'utilisateur qui a fait la première requête.

Cookie

Un cookie est un petit paquet d'information, renvoyé par le serveur grâce à l'en-tête Set-Cookie:

HTTP/1.1 200 OK Server: nginx/1.14.0 (Ubuntu) Date: Tue, 19 Oct 2021 17:33:53 GMT Content-Type: text/html Content-Length: 2 Set-Cookie: foo=superdata42; Max-Age=3600 ...

Le site crée un cookie appelé foo, contenant la valeur superdata42 et d'une durée de vie de 3600 secondes.

Cette donnée est stockée par le navigateur et renvoyée pour chaque requête (tant qu'il n'a pas expiré).

Utilité ?

On peut faire persister de l'information entre plusieurs requêtes.

Problème : l'information est sous le contrôle du client.

Session HTTP

Une session HTTP est un ensemble de paires requêtes/réponses entre un client et le serveur. Un état est maintenu côté serveur pour toute la durée de la session. Exemple :

Implémentation des sessions

On peut implémenter des sessions en utilisant des cookies.

On suppose que le serveur maintient un dictionnaire de dictionnaires appelé S.

  1. Lorsque le client se connecte, regarder la valeur d'un cookie particulier (par exemple MySessionID)
  2. Si ce cookie n'existe pas, on choisit un identifiant aléatoire (i), et on crée une nouvelle entrée : S[i] = {}
  3. On envoie au client l'en-tête Set-Cookie: MySessionID=i;Max-Age=600.
  4. Lorsque le client se reconnecte et fournit le cookie, on va chercher S[i] et le serveur peut alors y stocker des données propres au client.
  5. Si le client ne se connecte pas au bout de 10 minutes, le navigateur détruit le cookie, et on reprend en 1.

Considérations de sécurité pour les sessions

HTML, le format des documents

HTML

HyperText Markup Language : langage de mise en forme de documents hypertextes (texte + liens vers d'autres documents). Développé au CERN en 1989.
1991 : premier navigateur en mode texte
1993 : premier navigateur graphique (mosaic) développé au NCSA (National Center for Supercomputing Applications)

Document HTML

Exemple Rendu par défaut
Un texte <b>en gras</b> Un texte en gras
<a href="http://www.u-psud.fr">Un lien</a> Un lien
<ul > <li>Premièrement</li> <li>Deuxièmement</li> </ul>
  • Premièrement
  • Deuxièmement

On dit que

<toto> est une balise ouvrante et </toto> une balise fermante. On peut écrire <toto/> comme raccourci pour <toto></toto>.

Historique du langage HTML

1973 GML, Generalised Markup Language développé chez IBM. Introduction de la notion de balise.
1980 SGML, Standardised GML, adopté par l'ISO
1989 HTML, basé sur SGML. Plusieurs entreprises (microsoft, netscape, ... ) interprètent le standard de manière différente
1996 XML, eXtensible Markup Language norme pour les documents semi-structurés (SGML simplifié)
2000 XHTML, version de HTML suivant les conventions XML
2008 Première proposition pour le nouveau standard, HTML5
2014 Standardisation de HTML 5.0
2017 Standardisation de HTML 5.2

Rôle d'HTML

Séparer la structure du document de son rendu. La structure donne une sémantique au document :

Cela permet au navigateur d'assurer un rendu en fonction de la sémantique. Il existe différents types de rendus:

Exemple de document

<!DOCTYPE html> <html> <head> <title>Un titre</title> <meta charset="UTF-8" /> </head> <body> <h1>Titre de section</h1> <p> premier paragraphe de texte. On met un <a href="http://www.lri.fr">lien</a> ici. </p> <!-- on peut aussi mettre des commentaires --> </body> </html>

Structure d'un document HTML

Pour être valide un document HTML contient au moins les balises suivantes :

Titres

Les balises <h1>, <h2>, <h3>, <h4>, <h5>, <h6>, permettent de créer des titres de section, sous-section , sous-sous-section ,…

Paragraphes

Des paragraphes de textes sont introduits avec les balises <p>. Par défaut chaque paragraphe implique un retour à la ligne:

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamc</p> <p>Nouveau paragraphe</p>

Remarque : par défaut, les espaces, retour à la ligne, … sont ignorés et le texte est reformaté pour remplir la largeur de la page.

Mise en forme du texte

Les balises <b> (bold, gras), <i> (italic, italique), <u> (underlined, souligné) <em> (emphasis, important) et beaucoup d'autres permettent de décorer le texte.

<p><b>Lorem ipsum dolor</b> sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. <u>Ut enim ad minim veniam</u>, <em>quis</em> nostrud exercitation ullamc</p> <p><i>Nouveau</i> paragraphe</p>

Tableaux

On peut formater des tables en utilisant :

<table> <tr> <th>Nom</th> <th>Prénom</th> <th>Note 1</th> <th>Note 2</th></tr> <tr> <td>Foo</td> <td>Bar</td> <td> 15</td> <td>12</td> </tr> <tr> <td>Doe </td> <td>Jonh</td> <td colspan="2">Absent</td></tr> </table>
Les espaces et retours à la ligne ne sont là que pour rendre le code lisible !

Listes

On peut créer des listes énumérées (avec <ol>, ordered list) ou non énumérées (avec <ul>, unordered list). Chaque ligne est limitée par une balise <li> ( list item)

<ul> <li> Un élément </li> <li> <ol> <li> Un autre élément </li> <li> <ol> <li> Un sous-élément</li> <li> Un autre sous-élément</li> </ol> </li> </ol> <li>Le dernier</li> </ul>

Liens hyper-texte

On peut faire référence à une autre ressource en utilisant un lien hyper-texte (balise <a/> et son attribut href). La cible du lien peut être absolue (une URL complète avec le protocole, par exemple https://www.lri.fr) ou relative (par exemple foo.html). Si l'URL est relative, le chemin est substitué à la dernière composante de l'URL de la page courante. Si l'URL commence par un # elle référence, l'attribut id d'un élément de la page:

<a href="https://www.lri.fr">Le LRI</a> <a href="../../../index.html">Un lien</a> <a href="#foo">On va vers le titre</a> … <h1 id="foo">Le titre</h1>

Remarques générales

CSS

Cascading Style Sheets (CSS)

CSS
Langage permettant de décrire le style graphique d'une page HTML

On peut appliquer un style CSS :

L'attribut style

<a href="http://www.lri.fr" style="color:red">Un lien</a>

Apperçu:

Un lien

Inconvénients :

L'élément style

<html> <head> <title>…</title> <style> a { color: red; } </style> </head> <body> <a href="…">Lien 1</a> <a href="…">Lien 2</a> </body> </html>

Apperçu :

Lien 1 Lien 2

Inconvénient : local à une page

Fichier .css séparé

Fichier style.css:

a { color: red; }

Fichier test.html:

<html> <head> … <link href="style.css" type="text/css" rel="stylesheet" /> </head> … </html>

Modifications & déploiement aisés

Syntaxe

Une propriété CSS est définie en utilisant la syntaxe:

nom_prop : val_prop ;

Propriétés

Unités de longueur

CSS permet de spécifier des longueurs comme valeurs de certaines propriétés (position et taille des éléments, épaisseur des bordures, …). Les longueurs doivent comporter une unité. Les unités reconnues sont:

px
pixel
in
pouce (2,54cm)
cm
centimètre
mm
millimètre
pt
point (1/72ème de pouce, 0,35mm)
pc
pica (12 points)
em
facteur de la largeur d'un caractère de la police courante
ex
facteur de la hauteur d'un caractère « x » de la police courante
%
pourcentage d'une valeur particulière (définie par propriété)
vh
viewport height (% de la hauteur de la partie visible de la page)
vw
viewport width (% de la largeur de la partie visible de la page)
vmin
plus petite valeur entre vw et vh
vmax
plus grande valeur entre vw et vh

Boîte

Chaque élément de la page HTML possède une boîte rectangulaire qui délimite le contenu de l'élément:

margin
border
padding
Lien 1

La zone entre le contenu et la bordure s'appelle le padding (« remplissage »). La zone autour de la bordure s'appelle margin ( « marge »).

Marge, bordure, ajustement

On peut spécifier jusqu'à 4 valeurs:

span { padding:10pt 20pt 5pt 0pt; margin:10pt 5pt; border-width:3pt; border-color:red blue green; border-style:solid dotted; }
Du texte dans une boite

Calcul de la taille d'une boîte

L'attribut CSS box-sizing permet de spécifier le mode de calcul de la taille d'une boîte. Deux valeurs sont possible :

content-box
(valeur par défaut) signifie que la taille d'une boîte (telle que donnée par width ou height) est uniquement celle de son contenu.
border-box
signifie que la taille d'une boîte (telle que donnée par width ou height) est uniquement celle de son contenu, de l'ajustement et des bordures.
la marge n'est jamais prise en compte dans le calcul de la taille.
Exemple : border: 2px; padding: 10px; width: 100px;

box-sizing: content-box;

contenu 100px (total 124px)
ABCDEFGHIJKLMNOPQRSTUVWXY
box-sizing: border-box;

contenu 76px (total 100px)
ABCDEFGHIJKLMNOPQRSTUVWXY

Modes d'affichage

La propriété display contrôle le mode d'affichage d'un élément:

none
l'élément n'est pas dessiné et n'occupe pas d'espace
inline
l'élément est placé sur la ligne courante, dans le flot de texte. La taille du contenu (avec les marges, ajustements et bordures) dicte la taille de la boîte, height et width sont ignorés ( <i>, <b>, <span>, <em>, … sont inline par défaut).
block
l'élément est placé seul sur sa ligne. La taille est calculée automatiquement mais peut être modifiée par width et height ( <div>, <h1>, <p>, … sont block par défaut)
inline-block
positionné comme inline mais la taille peut être modifiée comme pour block

Modes d'affichage (exemples)

a { display: inline; … }
Le lien 1, le lien 2 et le lien 3.
a { display: none; … }
Le lien 1, le lien 2 et le lien 3.
a { display: block; … }
Le lien 1, le lien 2 et le lien 3.
a { display: inline-block; width: 4em; height: 2em; … }
Le lien 1, le lien 2 et le lien 3.

Positionnement

Le type de positionnement est donné par la propriété position

static positionnement « automatique »
fixed positionnement par rapport à la fenêtre du navigateur (la boîte est supprimée du flot)
relative positionnement « relatif » par rapport à la position normale
absolute positionnement « absolu » par rapport à l'ancêtre le plus proche qui n'est pas static

Pour fixed, relative et absolute, les propriétés top, bottom, left et right dénotent les décalages respectifs.

fixed (right:10pt,top:10pt)

Positionnement (exemple)

a { position: static; … } a { position: fixed; right:10pt; top: 10pt; }
a { position: relative; left: 10pt; bottom: -5pt; … } a { position:absolute; right:0pt; bottom: 10pt; }

<ul style="position:relative;"><li>…</li> …</ul>

Gestion du débordement

L'attribut overflow permet de gérer le débordement. Il peut prendre les valeurs visible, hidden et auto :

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Couleurs

Les couleurs peuvent être données:

On peut définir la couleur de fond d'une boîte avec la propriété background et la couleur du texte avec la propriété color

Propriétés du texte

Certaines propriétés permettent d'alterer le rendu du texte d'un élément

direction ltr ou rtl (orientation du texte)
text-transform capitalize, uppercase, lowercase
text-decoration underline, overline, line-through
text-align left, right, center, justify
text-indent longueur du retrait de paragraphe
vertical-align alignement vertical par rapport à la ligne de texte
baseline, top, bottom, middle ou une longueur.

Propriétés de la police

font-family liste de nom de polices séparées par des virgules (Helvetica, sans, "Times New Roman")
font-style normal, italic
font-weight normal, lighter, bold, bolder
font-size soit une longueur soit xx-small, x-small, small, medium, large, x-large, xx-large

On peut aussi spécifier un descripteur de police

@font-face { font-family: Toto; src: url(toto.ttf); } a { font-family: Toto; }

Sélectionneurs et application en cascade

Sélectionneurs

On peut sélectionner finement les éléments auxquels un style s'applique :

* tous les éléments
x tous les éléments dont la balise est x
.foo tous les éléments dont l'attribut class contient foo
x.foo (sans espace) tous les éléments dont l'attribut class contient foo et dont la balise est x
#foo l'élément dont l'attribut id vaut foo (les id doivent être uniques)
X Y tous les éléments selectionnés par Y qui sont des descendants des éléments sélectionnés par X
X, Y tous les éléments selectionnés par X ou par Y
X > Y tous les éléments dont selectionné par Y qui sont des fils d'éléments sélectionnés par X
a:visited les liens déjà visités
a:link les liens non visités
X:hover élément selectionné par X et survollé par la souris

La spécification CSS3 en définit beaucoup d'autres …

Attributs id et class

On veut souvent pouvoir appliquer un style à un unique élément d'une page, ou a un groupe d'éléments bien défini. On utilise pour celà l'attribut id de l'élément ou l'attribut class commun à plusieurs éléments:

Fichier CSS: ————————————————————————— #toto123 { background:red; } .bluetext { color: blue; } .border { border: 1pt solid green; } Fichier HTML ————————————————————————— <html> <head> ... </head> <body> <div class="bluetext"> AAA </div> <div id="toto123" class="border"> BBB </div> <div class="border bluetext"> CCC </div> </body> </html> L'élément d'id toto123 a un fond rouge. Les éléments de classe bluetext sont bleus Les éléments de classe border une bordure verte AAA BBB CCC

Composition de sélectionneurs

Les sélectionneurs CSS peuvent être composés afin de créer des chemins de sélection :

div li a { … } /* tous les a descendants d'un li descendants d'un div */ #id100 > p .foo { … } /* tous les éléments de class foo se trouvant à n'importe quelle profondeur sous un p lui-même étant un sous-élément direct de l'élément d'id id100 */ p.bar { … } /* toutes les balises p qui ont la classe bar */ p .bar { … } /* toutes la balises ayant la classe bar placées sous une balise p (attention à l'espace !) */ a, li * /* tous les a ou tous les éléments placés sous un li */

Cascade ? (priorités)

Que se passe-t-il quand un éléments est sélectionnés par plusieurs sélectionneurs ?

Exemple de sélectionneurs ambigus

* { color: blue; } /* score (0, 0, 0) */ #id101 li b { color: red; } /* score (1, 0, 2) */ #id101 ol * b { color: green; } /* score (1, 0, 2) */ .class ol li b { color: pink; } /* score (0, 1, 3) */

Le score le plus élevé est (1, 0, 2). Il y a deux sélectionneurs qui ont ce score, on choisit le dernier dans l'ordre du fichier donc le texte des éléments sélectionnés sera vert.

exemple de pseudo-classes: menu dépliable

<ul class="menu"> <li>Entrée 1 <ul class="sous-menu"> <li>Sous-entrée 1.1 </li> <li>Sous-entrée 1.2 </li> <li>Sous-entrée 1.3 </li> </ul> </li> <li>Entrée 2 <ul class="sous-menu"> <li>Sous-entrée 2.1 </li> <li>Sous-entrée 2.2 </li> <li>Sous-entrée 2.3 </li> </ul> </li> </ul>

Analyse

Pour que le ménu soit « dépliable » lors du survol de la souris, on souhaite que :

exemple : menu dépliable (démo)