Article de reference

JavaScript

{{Cite press release |url=https://wp.netscape.com/newsref/pr/newsrelease67.html |archive-url=https://web.archive.org/web/20070916144913/https://wp.netscape.com/newsref/pr/newsre...

Page semi-protégée
Écoutez cet article
langage de programmation et une technologie fondamentale du Web , au même titre que HTML et CSS . Créé par Brendan Eich en 1995, il est maintenu par le comité technique TC39 d' Ecma International , tandis que les API Web associées sont maintenues par le W3C et le WHATWG . En 2025, JavaScript était le langage de programmation le plus utilisé sur GitHub .

Les navigateurs Web possèdent un moteur JavaScript dédié qui exécute le code client . Ces moteurs sont également utilisés sur certains serveurs et dans diverses applications . Le système d'exécution le plus populaire pour utilisation hors navigateur est Node.js. [

JavaScript est un langage de haut niveau , souvent compilé à la volée, conforme à la norme ECMAScript . Il offre un typage dynamique , une programmation orientée objet basée sur les prototypes et des fonctions de première classe . Multi-paradigme , il prend en charge les styles de programmation événementiel , fonctionnel et impératif . Il dispose d'interfaces de programmation (API) permettant de manipuler du texte, des dates, des expressions régulières , des structures de données standard et le DOM ( Document Object Model ).

La norme ECMAScript ne prend pas en charge les entrées/sorties (E/S), telles que la gestion du réseau , le stockage ou le traitement graphique . En pratique, le navigateur web ou tout autre système d'exécution fournit des API JavaScript pour les E/S.

Bien que Java et JavaScript aient un nom et une syntaxe similaires , ces deux langages sont distincts et diffèrent considérablement dans leur conception.

navigateur web populaire doté d'une interface utilisateur graphique , Mosaic , a été lancé en 1993. Les principaux développeurs de Mosaic ont ensuite fondé la société Netscape , qui a lancé un navigateur plus abouti, Netscape Navigator , en 1994. Celui-ci est rapidement devenu le plus utilisé.

Durant les premières années du Web, les pages web étaient statiques et ne pouvaient pas s'afficher de manière dynamique une fois chargées dans le navigateur. Face à cette limitation, la communauté florissante du développement web souhaitait y remédier. C'est ainsi qu'en 1995, Netscape décida d'intégrer un langage de programmation à Navigator. Pour ce faire, deux approches furent envisagées : une collaboration avec Sun Microsystems pour intégrer le langage Java , et le recrutement de Brendan Eich pour intégrer le langage Scheme .

L'objectif était de créer un « langage pour tous » , « afin d'aider les non-programmeurs à créer des sites Web dynamiques et interactifs » . La direction de Netscape décida rapidement que la meilleure solution consistait à ce qu'Eich conçoive un nouveau langage, avec une syntaxe similaire à Java et moins proche de Scheme ou d'autres langages de script existants . Bien que le nouveau langage et son interpréteur aient été initialement appelés LiveScript lors de leur première distribution dans le cadre d'une version bêta de Navigator en septembre 1995, le nom fut changé en JavaScript pour la version officielle en décembre

Le choix du nom JavaScript a engendré une confusion, laissant entendre qu'il est directement lié à Java. À l'époque, la bulle Internet avait commencé et Java était un nouveau langage populaire ; Eich considérait donc le nom JavaScript comme une stratégie marketing de Netscape.

Adoption par Microsoft

Microsoft a lancé Internet Explorer en 1995, ce qui a déclenché une guerre des navigateurs avec Netscape. Concernant JavaScript, Microsoft a créé son propre interpréteur appelé JScript .

Microsoft a lancé JScript en 1996, en même temps qu'une prise en charge initiale du CSS et des extensions HTML . Chacune de ces implémentations différait sensiblement de son équivalent dans Netscape Navigator . Ces différences compliquaient la tâche des développeurs pour que leurs sites web fonctionnent correctement dans les deux navigateurs, ce qui a conduit à l'utilisation généralisée des logos « Affichage optimal dans Netscape » et « Affichage optimal dans Internet Explorer » pendant plusieurs années.

L'essor de JScript

Brendan Eich a déclaré plus tard à propos de cette période : « C’est encore un langage un peu secondaire . Il est considéré comme lent ou agaçant. Les gens utilisent des pop-ups ou ces messages défilants dans l’ancienne barre d’état en bas de votre ancien navigateur . »

En novembre 1996, Netscape a soumis JavaScript à Ecma International , servant de point de départ à une spécification standard à laquelle tous les fournisseurs de navigateurs pourraient se conformer. Cela a conduit à la publication officielle de la première spécification du langage ECMAScript en juin 1997.

Le processus de normalisation s'est poursuivi pendant quelques années, avec la publication d'ECMAScript 2 en juin 1998 et d'ECMAScript 3 en décembre 1999. Les travaux sur ECMAScript 4 ont commencé en 2000.

Cependant, les efforts de normalisation complète du langage ont été compromis par la position dominante croissante de Microsoft sur le marché des navigateurs. Au début des années 2000, la part de marché d' Internet Explorer atteignait 95 % . De ce fait, JScript est devenu la norme de facto pour les scripts côté client sur le Web.

Microsoft a initialement participé au processus de normalisation et a implémenté certaines propositions dans son langage JScript, mais a finalement cessé de collaborer aux travaux d'ECMA. ECMAScript 4 a donc été abandonné.

Croissance et normalisation

Durant la période de domination d' Internet Explorer au début des années 2000, le développement de scripts côté client stagnait. La situation a commencé à évoluer en 2004, lorsque Mozilla , successeur de Netscape , a lancé le navigateur Firefox . Firefox a rencontré un vif succès et a conquis une part de marché importante au détriment d'Internet Explorer.

En 2005, Mozilla a rejoint ECMA International et les travaux sur la norme ECMAScript pour XML (E4X) ont débuté. Mozilla s'est alors associée à Macromedia (rachetée par la suite par Adobe Systems ), qui implémentait E4X dans son langage ActionScript 3, basé sur une ébauche d'ECMAScript 4. L'objectif était de normaliser ActionScript 3 comme nouvel ECMAScript 4. À cette fin, Adobe Systems a publié l' implémentation Tamarin en tant que projet open source . Cependant, Tamarin et ActionScript 3 étaient trop différents des langages de script côté client existants et, sans la coopération de Microsoft, ECMAScript 4 n'a jamais abouti.

Parallèlement, des avancées majeures se produisaient au sein des communautés open source non affiliées aux travaux d'ECMA. En 2005, Jesse James Garrett publia un livre blanc dans lequel il inventa le terme Ajax et décrivait un ensemble de technologies, dont JavaScript constituait la base, permettant de créer des applications web où les données pouvaient être chargées en arrière-plan, évitant ainsi le rechargement complet de la page. Ceci marqua le début d'une renaissance de JavaScript, impulsée par les bibliothèques open source et les communautés qui se formèrent autour d'elles. De nombreuses nouvelles bibliothèques virent le jour, parmi lesquelles jQuery , Prototype , Dojo Toolkit et MooTools .

Google a lancé son navigateur Chrome en 2008, doté du moteur JavaScript V8 , plus rapide que celui de ses concurrents. L'innovation majeure résidait dans la compilation à la volée (JIT), obligeant ainsi les autres fournisseurs de navigateurs à refondre leurs moteurs pour l'intégrer.

En juillet 2008, ces différentes parties prenantes se sont réunies lors d'une conférence à Oslo . Celle-ci a abouti, début 2009, à un accord visant à mutualiser tous les travaux pertinents et à faire progresser le langage. Il en a résulté la norme ECMAScript 5, publiée en décembre 2009.

Parvenir à maturité

Un travail ambitieux sur le langage s'est poursuivi pendant plusieurs années, aboutissant à une vaste collection d'ajouts et d'améliorations formalisés avec la publication d' ECMAScript 6 en 2015.

La création de Node.js en 2009 par Ryan Dahl a entraîné une augmentation significative de l'utilisation de JavaScript en dehors des navigateurs web. Node combine le moteur V8 , une boucle d'événements et des API d'entrée/sortie , offrant ainsi un système d'exécution JavaScript autonome. En 2018, Node était utilisé par des millions de développeurs , et npm possédait le plus grand nombre de modules parmi tous les gestionnaires de paquets au monde.

La spécification préliminaire d'ECMAScript est actuellement maintenue en open source sur GitHub , et des éditions sont produites via des instantanés annuels réguliers . Les révisions potentielles du langage sont examinées par le biais d'un processus de proposition exhaustif . Désormais, au lieu de numéros d'édition, les développeurs vérifient individuellement l'état des fonctionnalités à venir

L’écosystème JavaScript actuel comprend de nombreuses bibliothèques et frameworks , des pratiques de programmation établies et une utilisation importante de JavaScript en dehors des navigateurs web. De plus, avec l’essor des applications monopages et autres sites web utilisant intensivement JavaScript, plusieurs transpileurs ont été créés pour faciliter le processus de développement.

En 2025, l'immense majorité des sites web (98,9 %) utilisent JavaScript pour le comportement des pages web côté client .

Marque déposée

« JavaScript » est une marque déposée d' Oracle Corporation aux États-Unis. La marque a été initialement attribuée à Sun Microsystems le 6 mai 1997, puis transférée à Oracle lors de l'acquisition de Sun en 2009.

Une lettre a été diffusée en septembre 2024, à l'initiative de Ryan Dahl , appelant Oracle à libérer la marque JavaScript. Brendan Eich , le créateur original de JavaScript, figurait parmi les plus de 14 000 signataires qui ont soutenu l'initiative.

Utilisation du site Web côté client

JavaScript est le langage de script côté client dominant sur le Web, utilisé par 99 % des sites web à cette fin. Les scripts sont intégrés dans ou inclus à partir de documents HTML et interagissent avec le DOM .

Tous les principaux navigateurs web possèdent un moteur JavaScript intégré qui exécute le code sur l'appareil de l'utilisateur.

Exemples de comportement scripté

Bibliothèques et frameworks

Plus de 80 % des sites Web utilisent une bibliothèque JavaScript ou un framework Web tiers dans le cadre de leur script côté client.

jQuery est de loin le plus utilisé. Parmi les autres frameworks notables, citons Angular , Bootstrap , Lodash , Modernizr , React , Underscore et Vue . Plusieurs options peuvent être utilisées conjointement, comme jQuery et Bootstrap.

Toutefois, le terme « Vanilla JS » a été inventé pour les sites Web n’utilisant aucune bibliothèque ni aucun framework, mais s’appuyant entièrement sur les fonctionnalités JavaScript standard.

Autres utilisationsdans les navigateurs web . Les moteurs JavaScript sont désormais intégrés à une variété d'autres systèmes logiciels, tant pour les déploiements de sites web côté serveur que pour les applications non-navigateur .

Les premières tentatives de promotion de l'utilisation de JavaScript côté serveur ont été Netscape Enterprise Server et Internet Information Services de Microsoft , mais elles sont restées confidentielles . L'utilisation côté serveur a finalement commencé à se développer à la fin des années 2000, avec la création de Node.js et d'autres approches .

Electron , Cordova , React Native et d'autres frameworks d'application ont été utilisés pour créer de nombreuses applications dont le comportement est implémenté en JavaScript. Parmi les autres applications non-navigateur, on peut citer la prise en charge d'Adobe Acrobat pour la création de scripts à partir de documents PDF et les extensions GNOME Shell écrites en JavaScript.

Oracle fournissait Nashorn , un interpréteur JavaScript, dans le cadre de sa bibliothèque API Java Development Kit (JDK), ainsi que jjs, un interpréteur en ligne de commande, à partir de la version 8 du JDK. Il a été supprimé dans le JDK 15. En remplacement, Oracle a proposé GraalJS, également compatible avec OpenJDK , qui permet de créer et de référencer des objets Java dans du code JavaScript et d'ajouter des scripts d'exécution en JavaScript aux applications écrites en Java.

JavaScript a été utilisé dans certains systèmes embarqués , généralement en tirant parti de Node.js.

Exécution

moteur JavaScript

Les premiers moteurs JavaScript étaient des interpréteurs du code source , mais les moteurs modernes utilisent la compilation à la volée (JIT) pour améliorer les performances. Les moteurs JavaScript sont généralement développés par les fournisseurs de navigateurs web , et chaque navigateur majeur en intègre un. Dans un navigateur, le moteur JavaScript fonctionne de concert avec le moteur de rendu via le modèle objet de document (DOM) et les liaisons Web IDL . Cependant, l'utilisation des moteurs JavaScript ne se limite pas aux navigateurs ; par exemple, le moteur V8 est un composant essentiel du système d'exécution Node.js. Ils sont également appelés moteurs ECMAScript , d'après le nom officiel de la spécification. Avec l'avènement de WebAssembly , certains moteurs peuvent également exécuter ce code dans le même environnement isolé que le code JavaScript classique.

Système d'exécution

Un moteur JavaScript doit être intégré à un système d'exécution (tel qu'un navigateur web ou un système autonome) pour permettre aux scripts d'interagir avec l'environnement. Ce système d'exécution inclut les API nécessaires aux opérations d'entrée/sortie , notamment la gestion du réseau , le stockage et le traitement graphique , et permet l'importation de scripts.

JavaScript est un langage monothread. L'environnement d'exécution traite les messages d'une file d'attente un par un et appelle une fonction associée à chaque nouveau message, créant ainsi un cadre de pile d'appels contenant les arguments et les variables locales de la fonction . La taille de la pile d'appels varie en fonction des besoins de la fonction. Lorsque la pile d'appels est vide à la fin de l'exécution d'une fonction, JavaScript passe au message suivant dans la file d'attente. Ce processus est appelé boucle d'événements , dite « à exécution complète » car chaque message est entièrement traité avant que le suivant ne soit pris en compte. Cependant, le modèle de concurrence du langage décrit la boucle d'événements comme non bloquante : les entrées/sorties du programme sont effectuées à l'aide d'événements et de fonctions de rappel . Cela signifie, par exemple, que JavaScript peut traiter un clic de souris tout en attendant la réponse d'une requête de base de données.

Les environnements d'exécution autonomes notables sont Node.js , Deno et Bun .

Caractéristiques

Les caractéristiques suivantes sont communes à toutes les implémentations ECMAScript conformes, sauf indication contraire. Le nombre de mots réservés cités, y compris les mots clés, est de 50 à 60 et varie selon l'implémentation.

Impératif et structuré

de programmation structurée du C (par exemple, ifinstructions while, boucles switch, do whileetc.). Une exception partielle concerne la portée des variables : initialement, JavaScript ne disposait que de la portée des fonctions avec var`;`. La portée des blocs a été ajoutée dans ECMAScript 2015 avec les mots-clés ` letand` et const`.`. Comme le C, JavaScript fait la distinction entre expressions et instructions . Une différence syntaxique avec le C est l’insertion automatique du point-virgule , qui permet d’omettre ce dernier (qui termine les instructions).

Faiblement dactylographié

faiblement typé , ce qui signifie que certains types sont implicitement convertis en fonction de l'opération utilisée.

  • L' +opérateur binaire convertit les deux opérandes en une chaîne de caractères, sauf si les deux opérandes sont des nombres. Cela s'explique par le fait que l'opérateur d'addition sert également d'opérateur de concaténation.
  • L' -opérateur binaire convertit toujours les deux opérandes en un nombre.
  • Les deux opérateurs unaires ( +, -) convertissent toujours l'opérande en un nombre. Cependant, +convertit toujours en Number( binary64 ) tandis que -préserve BigInt( integer )

Les valeurs sont converties en chaînes de caractères comme suit :

  • Les chaînes de caractères sont laissées telles quelles.
  • Les nombres sont convertis en leur représentation sous forme de chaîne de caractères.
  • Les éléments des tableaux sont convertis en chaînes de caractères, puis ces chaînes sont jointes par des virgules ( ,).
  • Les autres objets sont convertis en une chaîne de caractères [object Object]Objectreprésente le nom du constructeur de l'objet.

Les valeurs sont converties en nombres en les convertissant d'abord en chaînes de caractères, puis en nombres. Ces processus peuvent être modifiés en définissant toStringdes valueOffonctions sur le prototype pour la conversion en chaîne et en nombre, respectivement.

JavaScript a été critiqué pour la manière dont il implémente ces conversions, car la complexité des règles peut être confondue avec une incohérence. Par exemple, lors de l'ajout d'un nombre à une chaîne de caractères, le nombre est converti en chaîne avant la concaténation, mais lors de la soustraction d'un nombre à une chaîne de caractères, c'est la chaîne qui est convertie en nombre avant la soustraction.

Conversions de types JavaScript
opérande gaucheopérateuropérande droitrésultat
[](tableau vide)+[](tableau vide)(chaîne vide)
[](tableau vide)+{}(objet vide)"[object Object]"(chaîne)
false(booléen)+[](tableau vide)"false"(chaîne)
"123"(chaîne)+1(nombre)"1231"(chaîne)
"123"(chaîne)-1(nombre)122(nombre)
"123"(chaîne)-"abc"(chaîne)NaN(nombre)

On mentionne souvent également que {} + []le résultat est 0un nombre. Ceci est trompeur : le {}résultat est interprété comme un bloc de code vide au lieu d’un objet vide, et le tableau vide est converti en nombre par l’ +opérateur unaire restant. Si l’expression est placée entre parenthèses ({} + []), les accolades sont interprétées comme un objet vide et le résultat de l’expression est "[object Object]"conforme aux attentes.

Dynamique

des langages de script, JavaScript est un langage à typage dynamique . Un type est associé à une valeur plutôt qu'à une expression. Par exemple, une variable initialement liée à un nombre peut être réassignée à une chaîne de caractères . JavaScript prend en charge différentes méthodes pour tester le type des objets, notamment le typage dynamique .

Évaluation en temps réel

evalfonction qui peut exécuter des instructions fournies sous forme de chaînes de caractères lors de l'exécution.

Orientation objet (basée sur des prototypes)

L’héritage prototypal en JavaScript est décrit par Douglas Crockford comme suit :

On crée des objets prototypes, puis… de nouvelles instances. Les objets étant mutables en JavaScript, on peut enrichir ces nouvelles instances en leur ajoutant de nouveaux champs et méthodes. Celles-ci peuvent ensuite servir de prototypes pour des objets encore plus récents. Inutile d’utiliser des classes pour créer de nombreux objets similaires… Les objets héritent d’autres objets. Quoi de plus orienté objet ?

En JavaScript, un objet est un tableau associatif , enrichi d'un prototype (voir ci-dessous) ; chaque clé correspond au nom d'une propriété de l'objet , et il existe deux syntaxes pour spécifier un tel nom : la notation pointée ( obj.x = 10) et la notation entre crochets ( obj["x"] = 10). Une propriété peut être ajoutée, réattribuée ou supprimée à l'exécution. La plupart des propriétés d'un objet (et toute propriété appartenant à la chaîne d'héritage du prototype de l'objet) peuvent être parcourues à l'aide d'une for...inboucle.

Prototypes

des prototypes là où de nombreux autres langages orientés objet utilisent des classes pour l'héritage , mais il est tout de même possible de simuler la plupart des fonctionnalités basées sur les classes grâce au système de prototypes . De plus, ECMAScript version 6 (publiée en juin 2015) a introduit les mots-clés ` class` , `extends` et `super` , qui simplifient la syntaxe en proposant une interface plus conventionnelle pour le système d'héritage prototypal sous-jacent. Les constructeurs sont déclarés en spécifiant une méthode nommée `constructor` , et toutes les classes héritent automatiquement de la classe de base `Object`, comme en Java.

" , 12345 ) ; console.log ( bob.name ) ; // Robert

Bien que le mécanisme objet sous-jacent repose toujours sur des prototypes, la nouvelle syntaxe est similaire à celle d'autres langages orientés objet. Les variables privées sont déclarées en préfixant le nom du champ par un dièse (#), et le polymorphisme n'est pas directement pris en charge, bien qu'il puisse être émulé en appelant manuellement différentes fonctions en fonction du nombre et du type d'arguments fournis.

Fonctions en tant que constructeurs d'objets

Les fonctions servent également de constructeurs d'objets, en plus de leur rôle habituel. Préfixer un appel de fonction par `new` crée une instance d'un prototype, héritant des propriétés et méthodes du constructeur (y compris celles du Objectprototype). ECMAScript 5 propose la Object.createméthode `new`, permettant la création explicite d'une instance sans héritage automatique du Objectprototype (dans les environnements plus anciens, le prototype peut être assigné à `new` null). La propriété `prototype` du constructeur prototypedétermine l'objet utilisé pour le prototype interne du nouvel objet. De nouvelles méthodes peuvent être ajoutées en modifiant le prototype de la fonction utilisée comme constructeur.

Robert" , 12345 ) ; console.log ( bob.name ) ; // Robert

Les classes intégrées de JavaScript, telles que ` ArrayList` et `Object` Object, possèdent également des prototypes modifiables. Cependant, il est généralement déconseillé de modifier les objets intégrés , car du code tiers peut utiliser ou hériter de méthodes et de propriétés de ces objets, et ne pas s'attendre à ce que le prototype soit modifié.

Les fonctions en tant que méthodes

méthode . Cette distinction intervient plutôt lors de l'appel de la fonction. Lorsqu'une fonction est appelée comme méthode d'un objet, le mot-clé local `this` de la fonction est lié à cet objet pour cet appel.

Fonctionnel

Les fonctions JavaScript sont des objets de première classe ; une fonction est considérée comme un objet. À ce titre, une fonction peut avoir des propriétés et des méthodes, telles que .call()et .bind().

Clôture lexicale

fermeture lexicale : la portée lexicale de la fonction externe (y compris toute constante, variable locale ou valeur d'argument) devient une partie de l'état interne de chaque objet de fonction interne, même après la fin de l'exécution de la fonction externe.

Fonction anonyme

les fonctions anonymes .

Délégatif

JavaScript prend en charge la délégation implicite et explicite .

Fonctions en tant que rôles (Traits et Mixins)

de rôle , comme les traits et les mixins . Une telle fonction définit un comportement supplémentaire par au moins une méthode liée au thismot-clé dans son functioncorps. Un rôle doit alors être délégué explicitement via `require` callou ` applyrequire` aux objets qui nécessitent un comportement supplémentaire non partagé par la chaîne de prototypes.

Composition et héritage d'objets

Bien que la délégation explicite basée sur les fonctions prenne en charge la composition en JavaScript, la délégation implicite intervient systématiquement lors du parcours de la chaîne de prototypes, par exemple pour trouver une méthode liée à un objet sans lui appartenir directement. Une fois la méthode trouvée, elle est appelée dans le contexte de cet objet. Ainsi, l'héritage en JavaScript est géré par un automatisme de délégation lié à la propriété `prototype` des fonctions constructeurs.

Divers

Numérotation à partir de zéro

JavaScript est un langage à index zéro .

fonctions variadiques

les paramètres formels et via l' argumentsobjet local. Il est également possible de créer des fonctions variadiques à l'aide de cette bindméthode.

Littéraux de tableaux et d'objets

tableaux associatifs dans d'autres langages) peuvent être créés à l'aide d'une syntaxe abrégée concise. De fait, ces littéraux constituent la base du format de données JSON .

Expressions régulières

les expressions régulières pour la recherche et la manipulation de texte.

Promesses
moteurs JavaScript prenaient en charge ces fonctionnalités non standard :

  • compréhensions de tableaux et expressions génératrices (comme en Python)
  • expressions de fonctions concises ( function(args) expr; cette syntaxe expérimentale est antérieure aux fonctions fléchées)
  • ECMAScript for XML (E4X), une extension qui ajoute la prise en charge native du XML à ECMAScript (non prise en charge dans Firefox depuis la version 21 )

Syntaxe

les variables peuvent être définies à l'aide des mots-clés var var` , let ou const . Les variables définies sans mot-clé seront définies dans la portée globale.

Les fonctions fléchées ont été introduites dans la 6e édition d'ECMAScript (2015) . Elles simplifient la syntaxe des fonctions en JavaScript. Les fonctions fléchées sont anonymes ; il est donc nécessaire de les référencer à l'aide d'une variable après leur création, sauf si elles sont placées entre parenthèses et exécutées immédiatement.

Voici un exemple de syntaxe JavaScript.

;// Déclare une variable globale et lui assigne la valeur 3. Ceci est généralement considéré comme une mauvaise pratique et ne fonctionnera pas si le mode strict est activé. t = 3 ;// Déclare une variable nommée `myNumber`, et lui assigne un nombre littéral (la valeur // `2`). let myNumber = 2 ;// Réassigne `myNumber` à une chaîne littérale (la valeur `"foo"`). // JavaScript est un langage à typage dynamique, donc ceci est autorisé. myNumber = "foo" ;

Notez les commentaires dans les exemples ci-dessus, qui étaient tous précédés de deux barres obliques .

Vous trouverez d'autres exemples sur la page Wikibooks consacrée aux exemples de syntaxe JavaScript .

Sécurité

DOM offrent la possibilité à des auteurs malveillants d'exécuter des scripts sur un ordinateur client via le Web. Les développeurs de navigateurs minimisent ce risque grâce à deux restrictions. Premièrement, les scripts s'exécutent dans un environnement isolé (sandbox) où ils ne peuvent effectuer que des actions liées au Web, et non des tâches de programmation générales comme la création de fichiers. Deuxièmement, les scripts sont soumis à la politique d'origine identique : les scripts provenant d'un site Web n'ont pas accès aux informations telles que les noms d'utilisateur, les mots de passe ou les cookies envoyés à un autre site. La plupart des failles de sécurité liées à JavaScript résultent de violations de la politique d'origine identique ou de l'environnement isolé.

Il existe des sous-ensembles de JavaScript général — ADsafe, Secure ECMAScript (SES) — qui offrent des niveaux de sécurité plus élevés, notamment pour le code créé par des tiers (comme les publicités). Closure Toolkit est un autre projet permettant l'intégration et l'isolation sécurisées de JavaScript et de HTML tiers.

La politique de sécurité du contenu (CSP) est la principale méthode utilisée pour garantir que seul du code de confiance est exécuté sur une page Web.

Script intersite

l'injection de code intersite (XSS), une violation de la politique d'origine identique . Les vulnérabilités XSS surviennent lorsqu'un attaquant parvient à intégrer un script malveillant dans la page web affichée à la victime, par exemple sur un site de banque en ligne. Ce script peut alors accéder à l'application bancaire avec les privilèges de la victime, ce qui peut entraîner la divulgation d'informations confidentielles ou des transferts d'argent sans son autorisation. L' assainissement du code HTML constitue une solution importante contre les vulnérabilités XSS .

Certains navigateurs offrent une protection partielle contre les attaques XSS par réflexion , où l'attaquant fournit une URL contenant un script malveillant. Cependant, même les utilisateurs de ces navigateurs restent vulnérables à d'autres types d'attaques XSS, notamment celles où le code malveillant est stocké dans une base de données. Seule une conception correcte des applications web côté serveur permet de se prémunir totalement contre les attaques XSS.

Les vulnérabilités XSS peuvent également survenir en raison d'erreurs d'implémentation commises par les auteurs de navigateurs.

Falsification de requête intersite

la falsification de requête intersite (CSRF). Dans une attaque CSRF, du code malveillant sur le site de l'attaquant trompe le navigateur de la victime et l'amène à effectuer des actions non désirées sur un site cible (comme un virement bancaire). Lorsque les sites cibles utilisent uniquement les cookies pour l'authentification des requêtes, les requêtes provenant du site de l'attaquant peuvent utiliser les mêmes identifiants de connexion valides que ceux de l'utilisateur initial. En général, pour se prémunir contre les attaques CSRF, il est nécessaire d'exiger une authentification via un champ caché, et non uniquement via les cookies, afin d'authentifier toute requête susceptible d'avoir des conséquences durables. La vérification de l'en-tête HTTP Referrer peut également s'avérer utile.

Le « détournement JavaScript » est un type d'attaque CSRF où une du JSON ou du JavaScript. Voici quelques solutions possibles :

  • exiger un jeton d'authentification dans les paramètres POST et GET pour toute réponse renvoyant des informations privées.

Confiance mal placée envers le client

Les développeurs d'applications client-serveur doivent être conscients que des clients non fiables peuvent être contrôlés par des attaquants. L'auteur d'une application ne doit pas présumer que son code JavaScript s'exécutera comme prévu (voire même qu'il s'exécutera tout court), car toute information secrète intégrée au code pourrait être extraite par un adversaire déterminé. Voici quelques implications :

  • Les auteurs de sites web ne peuvent pas masquer parfaitement le fonctionnement de leur code JavaScript, car le code source brut doit être envoyé au client. Ce code peut être obfusqué , mais l'obfuscation peut être déchiffrée par rétro-ingénierie.
  • La validation des formulaires JavaScript offre un confort d'utilisation, mais pas une sécurité. Si un site vérifie que l'utilisateur a accepté ses conditions d'utilisation ou filtre les caractères invalides dans les champs numériques, cette vérification doit être effectuée côté serveur, et non uniquement côté client.
  • Les scripts peuvent être désactivés de manière sélective, il est donc impossible de compter sur JavaScript pour empêcher des opérations telles que le clic droit sur une image pour l'enregistrer.
  • Il est considéré comme une très mauvaise pratique d'intégrer des informations sensibles telles que des mots de passe dans du code JavaScript, car elles peuvent être extraites par un attaquant.
  • La pollution de prototype est une vulnérabilité d'exécution permettant à des attaquants de modifier arbitrairement les propriétés du prototype d'un objet.

Confiance mal placée envers les développeurs

Les systèmes de gestion de paquets tels que npm et Bower sont populaires auprès des développeurs JavaScript. Ces systèmes permettent de gérer facilement les dépendances d'un programme vis-à-vis des bibliothèques d'autres développeurs. Ces derniers font confiance aux mainteneurs de ces bibliothèques pour assurer leur sécurité et leur mise à jour, mais ce n'est pas toujours le cas. Cette confiance aveugle a engendré des vulnérabilités. Les nouvelles versions de bibliothèques essentielles peuvent introduire des bogues ou des vulnérabilités dans tous les programmes qui en dépendent. Inversement, une bibliothèque peut rester non corrigée, avec des vulnérabilités connues, en circulation. Une étude menée sur un échantillon de 133 000 sites web a révélé que 37 % d'entre eux intégraient une bibliothèque présentant au moins une vulnérabilité connue. « Le délai médian entre la version la plus ancienne d'une bibliothèque utilisée sur chaque site web et la version la plus récente disponible est de 1 177 jours dans Alexa, et le développement de certaines bibliothèques encore utilisées a cessé il y a des années. » Il est également possible que le mainteneur d'une bibliothèque la supprime complètement. Cela s'est produit en mars 2016 lorsqu'Azer Koçulu a supprimé son dépôt de npm. Cela a entraîné la rupture de dizaines de milliers de programmes et de sites web dépendant de ses bibliothèques.

Erreurs de codage du navigateur et des plugins

les dépassements de tampon . Ces failles permettent à des attaquants d'écrire des scripts exécutant n'importe quel code sur le système de l'utilisateur. Ce code n'est en aucun cas limité à une autre application JavaScript. Par exemple, une exploitation d'un dépassement de tampon peut permettre à un attaquant d'accéder à l' API du système d'exploitation avec des privilèges de superutilisateur.

Ces défauts ont affecté les principaux navigateurs, notamment Firefox, Internet Explorer, et Safari.

Les modules d’extension, tels que les lecteurs vidéo, Adobe Flash et la vaste gamme de contrôles ActiveX activés par défaut dans Microsoft Internet Explorer, peuvent également présenter des failles exploitables via JavaScript (de telles failles ont déjà été exploitées par le passé).

Dans Windows Vista, Microsoft a tenté de limiter les risques de bogues tels que les dépassements de tampon en exécutant le processus Internet Explorer avec des privilèges limités. Google Chrome confine de la même manière ses moteurs de rendu de page dans leur propre « environnement isolé ».

erreurs d'implémentation du bac à sable

Les navigateurs web peuvent exécuter du JavaScript en dehors de l'environnement isolé (sandbox), avec les privilèges nécessaires pour, par exemple, créer ou supprimer des fichiers. Ces privilèges ne sont pas destinés à être accordés au code provenant du web.

L’octroi incorrect de privilèges à JavaScript depuis le Web a contribué à des vulnérabilités dans Internet Explorer et Firefox. Dans Windows XP Service Pack 2, Microsoft a réduit les privilèges de JScript dans Internet Explorer.

Microsoft Windows permet d'exécuter des fichiers sources JavaScript présents sur le disque dur d'un ordinateur comme des programmes à usage général, non isolés (voir : Windows Script Host ). Cela fait de JavaScript (comme VBScript ) un vecteur théoriquement viable pour un cheval de Troie , bien que les chevaux de Troie JavaScript soient rares en pratique. de type « rowhammer » a été décrite dans un article par des chercheurs en sécurité.

En 2017, une attaque basée sur JavaScript via navigateur a été démontrée, capable de contourner l'ASLR . Elle est appelée « ASLR⊕Cache » ou AnC.

En 2018, l'article annonçant les attaques Spectre contre l'exécution spéculative dans les processeurs Intel et autres comprenait une implémentation JavaScript.

Outils de développement

Des outils importants ont évolué avec la langue.

Technologies connexes

Java

Une idée fausse courante est que JavaScript est directement lié à Java . Tous deux possèdent effectivement une syntaxe similaire à celle du C (le langage C étant leur ancêtre commun le plus proche). Ils sont également généralement exécutés dans un environnement isolé ( sandbox ), et JavaScript a été conçu en s'inspirant de la syntaxe et de la bibliothèque standard de Java. En particulier, tous les mots-clés Java ont été réservés dans la version originale de JavaScript, la bibliothèque standard de JavaScript suit les conventions de nommage de Java, et les classes James Gosling de Sun Microsystems et JavaScript par Brendan Eich de Netscape Communications.

Les différences entre les deux langages sont plus marquées que leurs similitudes. Java utilise un typage statique , tandis que JavaScript utilise un typage dynamique . Java est chargé à partir de bytecode compilé , tandis que JavaScript est chargé sous forme de code source lisible par l'humain. Les objets Java sont basés sur les classes , tandis que ceux de JavaScript sont basés sur les prototypes . Enfin, Java n'a pris en charge la programmation fonctionnelle qu'à partir de Java 8, alors que JavaScript l'a fait dès le départ, sous l'influence de Scheme .

JSON

JSON est un format de données dérivé de JavaScript ; d’où son nom : JavaScript Object Notation. C’est un format largement utilisé et pris en charge par de nombreux autres langages de programmation.

Transpileurs

De nombreux sites web utilisent beaucoup de JavaScript, c'est pourquoi des transpileurs ont été créés pour convertir le code écrit dans d'autres langages, ce qui peut faciliter le processus de développement.

TypeScript et CoffeeScript sont deux langages notables qui se transpilent en JavaScript.

WebAssembly

WebAssembly est un langage plus récent, utilisant un format bytecode , conçu pour compléter JavaScript, notamment pour les parties critiques des scripts de pages web en termes de performances . Tous les principaux moteurs JavaScript prennent en charge WebAssembly , qui s'exécute dans le même environnement isolé que le code JavaScript classique.

asm.js est un sous-ensemble de JavaScript qui a servi de précurseur à WebAssembly.

Plus d articles de Worldlex Wiki

Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.

Explorer l index