# BBCode

BBCode est un langage de balisage léger inventé pour simplifier la mise en forme des messages sur les forums de discussion internet. « BBCode » est l'abréviation de Bulletin Board Code, « bulletin board » étant le surnom anglais des forums de discussion. Le BBCode est reconnaissable au fait que ses balises sont délimitées par des crochets ([ et ]), à la différence du HTML qui utilise les chevrons (< et >).

## Fonctionnement du BBCode
### Balisage du texte

L'utilisateur met son texte en forme en insérant les balises BBCode prises en charge par le forum ou site internet sur lequel il écrit. Les balises BBCode sont délimitées par des crochets (« [» et «] »). Le principe est similaire à celui du langage HTML : on encadre le passage à mettre en forme avec une balise ouvrante et une balise fermante. Par exemple, dans ce message : « Albert Camus est l'auteur de [i]La Peste[/i]. », les mots « La Peste » à l'intérieur de la balise [i]...[/i] seront affichés en italique.
C'est le propriétaire du forum (ou du site) qui détermine la liste des balises BBCode disponibles et leur nom. Contrairement au HTML, langage standardisé dans lequel le nom et la syntaxe des balises sont déterminés par une autorité centrale (le World Wide Web Consortium), il n'existe aucun standard pour le BBCode, il n'y a que des conventions. Par exemple, la balise [i] permet de mettre le texte en italique sur de nombreux sites, mais ce n'est pas une règle absolue. Plus la balise est spécifique, plus les usages ont tendance à varier. On rencontre au moins quatre noms de balises BBCode différents pour dissimuler un texte ([hide], [hidden], [spoil], [spoiler]).
En ce qui concerne la structure des balises, le BBCode suit les principes généraux des langages de balisage :
* Toute balise ouverte doit être fermée (sauf si elle est spécifiée autofermante).
Exemple : Le texte « Ceci est un mot en [i]italique » est invalide car il manque la balise [/i] fermante.
* Lorsque des balises sont imbriquées, elles doivent être fermées dans le bon ordre.
Exemple de syntaxe invalide : « [g][i]gras et italique[/g][/i] » Exemple de syntaxe valide : « [g][i]gras et italique[/i][/g] »
* Une balise peut avoir un attribut, dont la valeur est assignée par le signe égal (=).
Exemple : dans la balise « [color=red]...[/color] », la balise « color » indique que l'on veut colorer le texte et l'attribut « red » précise que l'on veut le colorer en rouge.

### Affichage du texte

Une fois que le message a été envoyé au site, ce dernier doit effectuer un traitement avant de pouvoir l'afficher aux internautes. En effet, du fait de l'absence totale de standardisation du BBCode, aucun navigateur web n'est capable d'interpréter ses balises. Le site doit être doté d'un convertisseur qui transformera les balises BBCode en balises HTML, le langage universel des pages web.
Si elles sont mal réalisées, ces conversions peuvent donner lieu à des failles de sécurité (voir plus bas).
Bien que le BBCode soit très majoritairement utilisé pour produire du HTML, il peut être converti dans d'autres langages si nécessaire, par exemple en XML.

## Avantages

Le principal avantage du BBCode est que sa syntaxe est souvent plus concise et explicite que le HTML. La mise en forme est ainsi plus conviviale, même pour les utilisateurs non familiers avec le concept de balisage. Par exemple, comparer ces deux syntaxes pour mettre un texte en rouge :
Le BBCode permet également au webmaster de restreindre le nombre des mises en forme à disposition de ses utilisateurs. Ceci permet, d'une part, de conserver une cohérence visuelle (par exemple, la taille, la couleur et les marges des titres seront identiques) et, d'autre part, d'empêcher l'emploi de mises en forme jugées peu esthétiques (surlignement, texte clignotant, etc.).

## Inconvénients

L'absence de normalisation des balises BBCode oblige l'utilisateur à s'adapter en fonction du forum ou site sur lequel il écrit. Certaines balises fonctionneront sur un site mais pas sur un autre, d'autres porteront un autre nom, ou porteront le même nom mais avec une syntaxe différente, etc. Les conflits entre noms de balises peuvent être problématiques. Par exemple, la balise [s]...[/s] signifiera « rayer le texte » sur un forum anglophone (strike) mais « souligner » sur un forum francophone, ce qui change le sens de la mise en forme.
Le BBCode pose un problème plus global d'interopérabilité. Si un webmaster change le système de gestion de contenu de son site, certaines balises utilisées dans les anciens messages risquent de ne plus fonctionner.

## Sentiment erroné de sécurité

Contrairement à une idée répandue, le BBCode n'offre que peu de protection contre les injections de code malveillant. Il est vrai que le principe d'établir une liste blanche des balises autorisées empêche l'usage de balises HTML dangereuses telles que la balise <script>, qui permettrait d'exécuter du code Javascript, ou <frame>, qui inclurait une page d'un site tiers dans la page d'origine. Cependant, il ne suffit pas de maîtriser les noms des balises, il faut également contrôler la valeur de leurs attributs. Par exemple, ce BBCode destiné à insérer une image :
devient normalement, après conversion en HTML :
On peut tenter d'y injecter du code malveillant en fermant prématurément le guillemet (....jpg") et en ouvrant une instruction Javascript non prévue (onerror="...) :
Si le convertisseur se contente de récupérer le contenu de la balise sans le contrôler, il produira ce code HTML potentiellement dangereux :
On voit ici que du code nuisible a pu être injecté sans avoir besoin de recourir à une balise non autorisée. En outre, la faille de sécurité est ouverte par une balise qui semble à première vue inoffensive (insertion d'une image). Cette faille provient de l'absence de filtrage des données. Dans cet exemple, le convertisseur aurait dû s'assurer que la balise [img] ne contient qu'une url. Le niveau de sécurité dépendra ensuite du niveau de tolérance du filtre : a minima, il devrait contrôler que l'adresse commence par « http:// » et ne contient pas d'espace ; la sécurité peut être renforcée en vérifiant, par exemple, que l'extension du fichier ciblé correspond bien à une image (JPEG, PNG, GIF...).
Seule la mise en place de procédures de filtrage du texte envoyé assure réellement la sécurité. L'existence de ce filtrage étant indépendante du format des données de départ, un texte formaté en BBCode peut tout à fait contenir du code malveillant et, inversement, l'utilisateur peut être autorisé à saisir des balises HTML sans que cela crée pour autant de faille de sécurité.