Intégrité des scripts tiers chargés dans le navigateur

Il vous est surement arrivé de constater que le développement Web fait la belle part a des éléments externes qui sont chargés dans votre navigateur. Par exemple de nombreux sites n’intègrent pas directement un certain nombre de librairies, mais font appel aux API google.

Exemple :

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>

Bien sûr, c’est une solution très simple et parfois même très optimisée, car google a parfois plus de répondant en termes de temps et de dispos que votre site….

Néanmoins, dans ce cas, vous chargez un élément dans votre navigateur et peut-être faites vous entrer le loup dans la bergerie. En effet, le Javascript chargé va pouvoir travailler comme il le veut avec votre navigateur, et communiquer avec un site externe (en l’occurrence basiquement celui ou il est chargé, sauf si vous travaillez correctement le CSP et la SOP et la ça ouvre plus….).

Il y a deux solutions pour régler ce problème. 

  1. Ne pas inclure les scripts externes dans une page Web. Solution idéale, mais pas toujours réaliste…En effet, le serveur qui vous fourni le script externe est peut être sous votre contrôle quand même ou tout simplement ceux qui vous développe le site Web, ne savent pas faire autrement….
  2. Trouver un mécanisme d’intégrité permettant de s’assurer que tout va bien pour le script chargé et détecter tout changement de ses valeurs.

Le W3C a sorti une spécification qui s’appelle la Subresource Integrity  qui permet de résoudre le second point. Cela va permettre d’ajouter, sur les navigateurs le supportant, un attribut à l’élément <script> pour cette intégrité.

Cela donne quelque chose comme cela :

<script type="text/javascript" integrity="sha384-MBO5IDfYaE6c6Aao94oZrIOiC6CGiSN2n4QUbHNPhzk5Xhm0djZLQqTpL0HzTUxk"src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>

Le calcul d’intégrité doit être effectué par le développeur via un algorithme connu. Il est donc préférable d’utiliser des SHA… Et cet attribut doit ensuite être encodé en BASE64 pour être ajouté dans le morceau de code HTML.

Cela a pour effet que si un bit du fichier est modifié, alors le hash final ne sera pas le même et donc l’intégrité ne serait pas correcte et le navigateur (compatible) sortira une alerte/erreur sur l’intégration de ce script.

Cela ne doit pas pour autant vous empêcher de vérifier quand même avant intégration le contenu du script pour vérifier qu’il n’a pas de contenu malveillant ! 

Pour l’instant les navigateurs suivants supportent cette fonctionnalité :

Comme d’habitude le merveilleux site CanIUse vous dit tout sur celui qui supporte ou pas cette fonctionnalité 

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s