Same Origin Policy
Deux documents ne provenant pas du même domaine ne peuvent pas accéder aux contenus respectifs :
- Pas d’accès au DOM, aux cookies, aux URLs, …
- Pas d’accès entre fenêtres et entre frames.
Cependant
- Les scripts inclus avec
<script>
ont plein accès (conséquence : SOP ne peut pas bloquer le JavaScript injecté) ; - Autres balises violant la SOP (et pour cause) :
<img>
,<link>
,<embed>
,<object>
,<iframe>
,<bgsound>
,<audio>
,<video>
, … window.name
viole la SOP (pas très utilisé) ;window.postMessage
: violation contrôlée de la SOP.
SOP : Exemple
Restrictions sur AJAX
- Un script peut envoyer une
XMLHttpRequest
vers toute adresse ; - il ne peut lire que les réponses provenant du même domaine.
Problème : comment interroger des APIs de sites tiers (Google maps, Yahoo finance, etc.) ?
AJAX Cross-domain
Problème : comment interroger des API tierces ?
Solution classique : Proxies
Écrire un programme côté server qui transmet la requête au service web.
…Pas très satisfaisant
Cross-Origin Resource Sharing
CORS : standardise en 2014 par le W3C :
- Le
XMLHttpRequest
fait une requête GET cross-domain ; - Le browser ajoute une entête HTTP
Origin
;
GET /api/query.php?car=peugeot HTTP/1.1
Host: api.webservice.com
...
Origin: www.example.com
- Le server réponds avec
Acces-Control-Allow-Origin
:
HTTP/1.1 200 OK
...
Access-Control-Allow-Origin: *
HTTP/1.1 200 OK
...
Access-Control-Allow-Origin: www.example.com
- Le browser renvoie la réponse à
XMLHttpRequest
seulement si l’origine est autorisée.
Les requêtes POST ne sont pas nilpotentes !
Par convention, les requêtes POST ont des effets non-réversibles → politique CORS adaptée
XMLHttpRequest
fait une requête POST cross-domain ;- Le browser change le type de la requête en OPTIONS ;
OPTIONS /api/query.php?car=peugeot HTTP/1.1
Host: api.webservice.com
Origin: www.example.com
Access-Control-Request-Method: POST
- Le server réponds avec
Acces-Control-Allow-Origin
:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: www.example.com
Access-Control-Allow-Methods: POST, GET, OPTIONS
- Si la requête est autorisée, le browser envoie la requête POST ;
POST /api/query.php?car=peugeot HTTP/1.1
Host: api.webservice.com
Origin: www.example.com
- La réponse est renvoyée à
XMLHttpRequest
.
CORS et sécurité
CORS est une protection opt-out : www.hacker.com
ne peut pas
se connecter à www.mybank.com
en se faisant passer pour un
utilisateur
- Cohérent avec la SOP des frames et des fenêtres ;
www.hacker.com
peut obliger www.mybank.com
à télécharger du
contenu de www.hacker.com
- Nécessite une faille XSS pour démarrer l’attaque ;
- Pas plus dangereux que les balises
<script>
,<iframe>
,<img>
, …
Exemple d’utilisation : contourner un filtrage bloquant
l’injection de balises <script>
.
Lectures
Google browser security guide (M. Zalewski)
- https://code.google.com/p/browsersec/wiki/Part1,
- https://code.google.com/p/browsersec/wiki/Part2,
- https://code.google.com/p/browsersec/wiki/Part3.
Same Origin Policy
- The tangled web, Part II,
- SOP,
- Cross Origin Resource Sharing.