Cross-Origin Resource Sharing (CORS) verstehen

Cross-Origin Resource Sharing (CORS) verstehen

Cross-Origin Resource Sharing (CORS) wurde 2006 vom World Wide Web Consortium (W3C) eingeführt, um Webservern die Möglichkeit zu bieten, beliebige andere Ursprünge (Domäne, Schema oder Port) anzugeben, die über die Same-Origin-Policy hinaus auf die Ressourcen des Servers zugreifen dürfen. Dies war eine bedeutende Weiterentwicklung der Websicherheit, die interaktivere und integriertere Webanwendungen unter Einhaltung strenger Sicherheitsprotokolle ermöglichte.

Das Verständnis der Funktionsweise von CORS (Cross-Origin Resource Sharing) ist für die moderne Webentwicklung von entscheidender Bedeutung. In diesem Abschnitt wird erläutert, wie CORS die Websicherheit verbessert, zwischen einfachen und Preflight-Anfragen unterscheidet und die Bedeutung von CORS-Headern erläutert.

Was ist Cross-Origin Resource Sharing?

CORS (Cross-Origin Resource Sharing) ist ein Mechanismus, der HTTP-Header verwendet, um einem Browser mitzuteilen, dass er einer an einem Ursprung (einer Domäne) ausgeführten Webanwendung die Berechtigung zum Zugriff auf ausgewählte Ressourcen eines Servers an einem anderen Ursprung erteilen soll. Dies ist eine entscheidende Entwicklung in der Websicherheit, da sie eine offenere Kommunikation zwischen verschiedenen Webdiensten ermöglicht und gleichzeitig vor böswilligen Angriffen schützt.

Wie CORS die Websicherheit verbessert: Ein technischer Einblick

CORS ist eine Sicherheitsfunktion, die es Webanwendungen ermöglicht, Anfragen an Server zu stellen, die an anderen Orten als die Website gehostet werden.

Vor CORS beschränkte die Same-Origin-Policy Webanwendungen darauf, Anfragen nur an dieselbe Domäne wie die Site zu stellen. Diese Richtlinie ist eine wichtige Sicherheitsmaßnahme, die böswilligen Sites den Zugriff auf vertrauliche Daten verwehrt. Sie schränkt aber auch legitime Cross-Origin-Interaktionen ein, die für moderne Webanwendungen erforderlich sind.

CORS ermöglicht es Servern, bestimmte Header einzubinden, die dem Browser mitteilen, welche Ursprünge auf die Ressourcen zugreifen dürfen. Hier ist ein einfaches Beispiel dafür, wie CORS die Sicherheit erhöht:

  1. Eine Webanwendung unter https://example.com versucht, eine Anfrage zu stellen an https://api.example.org/data.
  2. Der Browser sendet die CORS-Anfrage automatisch an https://api.example.org/data.
  3. Der Server bei https://api.example.org überprüft seine CORS-Richtlinie, um festzustellen, ob https://example.com ist erlaubt.
  4. Wenn https://example.com zulässig ist, antwortet der Server mit den entsprechenden CORS-Headern, wie z. B. Access-Control-Allow-Origin: https://example.com, was darauf hinweist, dass der Browser der Webanwendung den Zugriff auf die Ressourcen erlauben soll.

Ohne CORS würde die Same-Origin-Policy die Anforderung blockieren, mit CORS kann der Server jedoch Cross-Origin-Anfragen von vertrauenswürdigen Ursprüngen sicher zulassen.

Einfache vs. Preflight-Anfragen: Den Unterschied verstehen

CORS-Anfragen werden in zwei Typen unterteilt: einfache Anfragen und Preflight-Anfragen. Die Unterscheidung zwischen ihnen basiert auf der verwendeten Methode und den mit der Anfrage gesendeten Headern.

  • Einfache Anfragen: Dies sind Anfragen, die bestimmte von CORS definierte Kriterien erfüllen. Eine einfache Anfrage kann die Methode GET, POST oder HEAD verwenden. Darüber hinaus darf sie nur Header verwenden, die als sicher und nicht benutzerdefiniert gelten, wie z. B. Accept, Accept-Language, Content-Language, Und Content-Type mit Werten von application/x-www-form-urlencoded, multipart/form-data, oder text/plainHier ist ein Beispiel für eine einfache Anfrage:
fetch('https://api.example.org/data', {
  method: 'GET',
  headers: {
    'Accept': 'application/json',
  }
});
  • Preflight-Anfragen: Diese Anfragen erfüllen nicht die Kriterien für einfache Anfragen und erfordern eine anfängliche „Preflight“-Anfrage mit der Methode OPTIONS, bevor die eigentliche Anfrage gesendet wird. Dieser Preflight prüft, ob die eigentliche Anfrage sicher gesendet werden kann, basierend auf der CORS-Richtlinie der Zielressource. Preflight-Anfragen werden verwendet, wenn die Methode nicht GET, POST oder HEAD ist oder wenn benutzerdefinierte Header verwendet werden. Hier ein Beispiel:
fetch('https://api.example.org/data', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-Custom-Header': 'value'
  },
  body: JSON.stringify({key: 'value'})
});

In diesem Fall sendet der Browser zunächst eine OPTIONS-Anfrage an https://api.example.org/data um festzustellen, ob die POST-Anfrage mit einem Content-Type von application/json und ein benutzerdefinierter Header X-Custom-Header ist erlaubt.

CORS-Header erklärt: Was sie sind und wie sie funktionieren

CORS verlässt sich bei der Kommunikation zwischen Server und Browser auf bestimmte HTTP-Header. Diese Header legen fest, ob ein Browser eine Anfrage blockieren oder zulassen soll. Hier sind die wichtigsten CORS-Header:

  • Access-Control-Allow-Origin: Dieser Header gibt an, welche(r) Ursprung(e) auf die Ressource zugreifen darf. Er kann auf einen bestimmten Ursprung gesetzt werden, wie z. B. https://example.com, oder * alle Ursprünge zuzulassen (unter Verwendung * mit Anmeldeinformationen ist nicht zulässig).
  • Access-Control-Allow-Methods: Dieser Header wird als Antwort auf eine Preflight-Anfrage verwendet, um anzugeben, welche HTTP-Methoden beim Zugriff auf die Ressource zulässig sind.
  • Access-Control-Allow-Headers: Als Antwort auf eine Preflight-Anfrage gibt dieser Header an, welche Header in der eigentlichen Anfrage verwendet werden können.
  • Access-Control-Expose-Headers: Mit diesem Header können Server Header auf die Whitelist setzen, auf die Browser zugreifen dürfen.
  • Access-Control-Allow-Credentials: Dieser Header gibt an, ob die Antwort auf die Anfrage angezeigt werden kann, wenn das Anmeldeinformations-Flag wahr ist. Es muss auf true ob Cookies oder Authentifizierungsdetails an der Anfrage beteiligt sind.
  • Access-Control-Max-Age: Dieser Header gibt an, wie lange die Ergebnisse einer Preflight-Anfrage zwischengespeichert werden können.

Das Verstehen und die ordnungsgemäße Implementierung von CORS-Headern ist für die Sicherung von Webanwendungen und die Zulassung notwendiger Cross-Origin-Anfragen unerlässlich. Durch das Festlegen dieser Header können Entwickler genau festlegen, welche Cross-Origin-Anfragen zulässig sind, und so sicherstellen, dass nur vertrauenswürdige Quellen auf ihre Webressourcen zugreifen können.

Implementierung von CORS

Die Implementierung von Cross-Origin Resource Sharing (CORS) ist für moderne Webanwendungen, die mit Ressourcen unterschiedlicher Herkunft interagieren, unerlässlich. In diesem Abschnitt erfahren Sie, wie Sie CORS in Ihren Anwendungen aktivieren, häufige CORS-Fehler beheben und Best Practices für Webentwickler skizzieren.

Aktivieren von CORS in Ihren Anwendungen: Eine Schritt-für-Schritt-Anleitung

Um CORS zu aktivieren, müssen Sie Ihren Server so konfigurieren, dass er als Antwort auf Anfragen die entsprechenden CORS-Header sendet. Der Vorgang variiert je nach verwendeter Servertechnologie (z. B. Apache, Nginx, Node.js). So aktivieren Sie CORS in verschiedenen Serverumgebungen:

  • Apache: Für Apache-Server können Sie CORS aktivieren, indem Sie die folgenden Anweisungen zu Ihrem .htaccess Datei oder Serverkonfigurationsdatei:
<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
    Header set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
    Header set Access-Control-Allow-Headers "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"
</IfModule>

Diese Konfiguration ermöglicht allen Ursprüngen (*), um Anfragen mit angegebenen Methoden und Headern zu stellen. Passen Sie die Access-Control-Allow-Origin Wert, um den Zugriff auf vertrauenswürdige Ursprünge einzuschränken.

  • Nginx: In Nginx kann CORS aktiviert werden, indem Sie Ihrem Serverblock Folgendes hinzufügen:
location / {
    if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT';
        add_header 'Access-Control-Allow-Headers' 'Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With';
        add_header 'Content-Length' '0';
        add_header 'Content-Type' 'text/plain charset=UTF-8';
        return 204;
    }
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, DELETE, PUT';
    add_header 'Access-Control-Allow-Headers' 'Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With';
}
  • Node.js (Express): Für Node.js-Anwendungen, die Express verwenden, kann CORS einfach aktiviert werden mit dem cors Middleware:
const express = require('express');
const cors = require('cors');

const app = express();

app.use(cors({
    origin: '*', // Adjust this to your specific origin
    methods: ['GET', 'POST', 'OPTIONS', 'DELETE', 'PUT'],
    allowedHeaders: ['Content-Type', 'Access-Control-Allow-Headers', 'Authorization', 'X-Requested-With'],
}));

app.get('/data', (req, res) => {
    res.json({ message: 'This is CORS-enabled for all origins!' });
});

app.listen(3000, () => {
    console.log('Server running on port 3000');
});

Debuggen häufiger CORS-Fehler: Tipps und Tricks

CORS-Fehler treten normalerweise auf, wenn der Browser eine Anfrage aufgrund der CORS-Richtlinie des Servers blockiert. Zu den häufigsten Fehlern gehören Meldungen über fehlende Access-Control-Allow-Origin Header oder Methoden sind nicht zulässig. So debuggen Sie diese Fehler:

  1. Browser DevTools verwenden: Moderne Browser geben detaillierte Fehlermeldungen in der Konsole aus. Diese Meldungen geben oft an, was fehlt oder falsch konfiguriert ist.
  2. Überprüfen der Serverkonfiguration: Stellen Sie sicher, dass Ihr Server richtig konfiguriert ist, um die erforderlichen CORS-Header zu senden. Fehlende Header oder falsche Werte sind häufige Probleme.
  3. Testen mit Tools: Tools wie Postman oder cURL können Anfragen von unterschiedlichen Ursprüngen simulieren und dabei helfen, festzustellen, ob der Server mit den richtigen CORS-Headern antwortet.
  4. Überprüfen Sie die CORS-Richtlinie: Stellen Sie sicher, dass Ihre CORS-Richtlinie auf dem Server den Anforderungen Ihrer Webanwendung entspricht. Wenn Ihre Anwendung beispielsweise Anmeldeinformationen senden muss (Cookies, HTTP-Authentifizierung), stellen Sie sicher Access-Control-Allow-Credentials ist eingestellt auf true Und Access-Control-Allow-Origin ist nicht eingestellt auf *.

Bewährte Methoden zur CORS-Konfiguration für Webentwickler

Für eine sichere und effiziente Implementierung von CORS ist die Einhaltung bewährter Methoden erforderlich:

  • Genaue Ursprünge angeben: Anstatt * für Access-Control-Allow-Origin, geben Sie die genauen Ursprünge an, denen der Zugriff auf Ihre Ressourcen gestattet werden soll. Dadurch wird die Gefährdung durch unerwünschte Cross-Origin-Anfragen begrenzt.
  • Verwenden Sie Anmeldeinformationen sorgfältig: Wenn Ihre Anwendung Anmeldeinformationen verwendet, stellen Sie sicher Access-Control-Allow-Credentials ist eingestellt auf trueund geben Sie genaue Ursprünge an, statt *. Denken Sie daran, dass zu den Anmeldeinformationen Cookies, HTTP-Authentifizierung und clientseitige SSL-Zertifikate gehören.
  • Offengelegte Header begrenzen: Nur notwendige Header verfügbar machen über Access-Control-Expose-Headers. Durch die Offenlegung zu vieler Header können vertrauliche Informationen unbeabsichtigt preisgegeben werden.
  • Überprüfen der Preflight-Cache-Dauer: Verwenden Access-Control-Max-Age um Preflight-Antworten zwischenzuspeichern und so die Anzahl der Preflight-Anfragen zu reduzieren. Stellen Sie jedoch sicher, dass die Dauer der Häufigkeit entspricht, mit der sich Ihre CORS-Richtlinie ändern kann.
  • Implementieren Sie dynamische CORS-Richtlinien: Erwägen Sie für komplexere Anwendungen die Implementierung dynamischer CORS-Richtlinien, die Access-Control-Allow-Origin basierend auf dem Ursprung der Anfrage. Dies kann programmgesteuert auf dem Server erfolgen.
  • Überprüfen Sie regelmäßig die CORS-Richtlinien: Überprüfen und aktualisieren Sie im Zuge der Weiterentwicklung Ihrer Webanwendung regelmäßig Ihre CORS-Richtlinien, um sicherzustellen, dass sie weiterhin Ihren Sicherheits- und Funktionsanforderungen entsprechen.

Indem sie diese Richtlinien befolgen und verstehen, wie CORS konfiguriert und debuggt wird, können Entwickler sicherstellen, dass ihre Web-Anwendungen sicher und effektiv über verschiedene Ursprünge hinweg kommunizieren.

CORS in Aktion

Bei der Implementierung von Cross-Origin Resource Sharing (CORS) geht es nicht nur darum, eine Funktion zu aktivieren; es geht darum, zu verstehen, wie sie im Kontext moderner Webanwendungen funktioniert. In diesem Abschnitt werden Beispiele aus der Praxis für CORS, die Verwaltung von CORS-Richtlinien sowie die Tools und Techniken für eine effektive Implementierung untersucht.

Beispiele aus der Praxis für CORS: Von der Theorie zur Praxis

CORS ist ein grundlegender Bestandteil der Webentwicklung, der es ermöglicht, Ressourcen sicher über verschiedene Ursprünge hinweg anzufordern. Hier sind einige reale Szenarien, in denen CORS eine entscheidende Rolle spielt:

  • API-Verbrauch in Single Page Applications (SPAs): SPAs nutzen häufig APIs, die auf verschiedenen Domänen gehostet werden. Beispielsweise eine React-Anwendung, die von https://myapp.com Möglicherweise müssen Sie Benutzerdaten abrufen von https://api.userdata.com. Ohne CORS würde diese Cross-Origin-Anfrage vom Browser blockiert werden. Durch das Setzen der entsprechenden CORS-Header (Access-Control-Allow-Origin: https://myapp.com) auf dem API-Server kann die SPA die benötigten Daten sicher anfordern.
// Example fetch request in an SPA
fetch("https://api.userdata.com/user", {
  method: "GET",
  headers: {
    "Content-Type": "application/json",
  },
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error fetching user data:', error));
  • Content-Delivery-Netzwerke (CDNs): CDNs stellen statische Assets (Bilder, Skripte, Stylesheets) von verschiedenen Standorten weltweit bereit. Wenn Ihre Webanwendung gehostet wird bei https://example.com fordert ein Bild an von https://cdn.example.comCORS stellt sicher, dass diese Cross-Origin-Anfragen für statische Assets sicher behandelt werden.
  • Widgets und Integrationen von Drittanbietern: Websites integrieren häufig Widgets von Drittanbietern (z. B. Chatbots, Social-Media-Feeds), die auf Ressourcen von externen Servern zugreifen müssen. CORS ermöglicht die reibungslose Funktion dieser Widgets über verschiedene Ursprünge hinweg und verbessert so das Benutzererlebnis, ohne die Sicherheit zu beeinträchtigen.

Verwalten von CORS-Richtlinien: Tools und Techniken für eine effektive Implementierung

Um CORS-Richtlinien effektiv verwalten zu können, müssen Sie die Ihnen zur Verfügung stehenden Tools und Techniken verstehen:

  • Serverkonfiguration: Der erste Schritt bei der Verwaltung von CORS-Richtlinien ist die Konfiguration Ihres Webservers. Dazu gehört das Festlegen der erforderlichen CORS-Header basierend auf den Anforderungen Ihrer Anwendung. Die meisten Webserver (Apache, Nginx, IIS) ermöglichen Ihnen das Angeben dieser Header in ihren Konfigurationsdateien oder über .htaccess (für Apache).
  • Middleware für Web-Frameworks: Wenn Sie ein Web-Framework verwenden (Express.js für Node.js, Django für Python), bieten viele davon Middleware-Pakete an, die die CORS-Richtlinienverwaltung vereinfachen. Zum Beispiel das cors Mit dem Paket für Express können Sie CORS-Richtlinien direkt in Ihrem Anwendungscode definieren.
// Example using the cors middleware in an Express.js application
const cors = require('cors');
const express = require('express');
const app = express();

// Define CORS options
const corsOptions = {
  origin: 'https://example.com',
  optionsSuccessStatus: 200,
};

app.use(cors(corsOptions));

app.get('/data', (req, res) => {
  res.json({ message: 'CORS-enabled route' });
});

app.listen(3000, () => console.log('Server running on port 3000'));
  • Dynamische CORS-Behandlung: Für Anwendungen, die Anfragen von mehreren vertrauenswürdigen Ursprüngen zulassen müssen, kann eine dynamische CORS-Behandlung implementiert werden. Dabei wird programmgesteuert festgelegt, Access-Control-Allow-Origin Header basierend auf dem Ursprung der eingehenden Anfrage.
// Example of dynamic CORS handling
app.use((req, res, next) => {
  const allowedOrigins = ['https://example.com', 'https://api.example.com'];
  const origin = req.headers.origin;
  if (allowedOrigins.includes(origin)) {
    res.setHeader('Access-Control-Allow-Origin', origin);
  }
  next();
});

Tools zum Testen und Debuggen von CORS-Richtlinien

  • Browser-Entwicklertools: Die Registerkarte „Netzwerk“ in den Browser-Entwicklertools ist von unschätzbarem Wert, um CORS-Fehler zu überprüfen und zu verstehen, wie CORS-Header in Echtzeit gesendet und empfangen werden.
  • Online Tools: Tools wie CORS-Tester Und Briefträger ermöglichen Ihnen, CORS-Richtlinien zu testen, indem Sie Anfragen von verschiedenen Ursprüngen an Ihren Server senden und die Antwort prüfen.
  • Befehlszeilentools: curl ist ein leistungsstarkes Tool zum Testen von CORS-Richtlinien über die Befehlszeile. Es kann verwendet werden, um Anforderungen aus verschiedenen Quellen zu simulieren und CORS-Header in der Antwort des Servers zu überprüfen.
# Example curl command to test CORS
curl -H "Origin: https://example.com" \
     -I https://api.example.com/data

Durch das Verständnis dieser realen Anwendungs- und Verwaltungsstrategien können Entwickler sicherstellen, dass ihre Webanwendungen sicher mit Ressourcen an verschiedenen Ursprüngen interagieren und so das volle Potenzial von CORS ausschöpfen.

Ob es darum geht, Cross-Origin-API-Anfragen in SPAs zu ermöglichen, Assets über CDNs bereitzustellen oder Widgets von Drittanbietern zu integrieren – CORS ist ein wesentlicher Bestandteil des modernen Web-Ökosystems, das bei richtiger Verwaltung sowohl Sicherheit als auch Funktionalität bietet.

Sicherheitsimplikationen von CORS

Die Implementierung von Cross-Origin Resource Sharing (CORS) hat erhebliche Auswirkungen auf die Sicherheit von Webanwendungen. CORS ermöglicht es Webanwendungen zwar, Ressourcen aus verschiedenen Quellen anzufordern, führt aber bei falscher Konfiguration auch zu potenziellen Sicherheitslücken.

In diesem Abschnitt werden die Sicherheitsaspekte von CORS näher erläutert. Dabei wird auf die Abwehr von Cross-Site-Scripting-Angriffen (XSS) und die Bedeutung strenger CORS-Richtlinien eingegangen.

CORS und Websicherheit: Abwehr von Cross-Site-Scripting-Angriffen (XSS)

Cross-Site-Scripting-Angriffe (XSS) ermöglichen Angreifern, schädliche Skripte in Inhalte ansonsten harmloser und vertrauenswürdiger Websites einzuschleusen.

Diese Angriffe erfolgen, wenn eine Anwendung nicht vertrauenswürdige Daten ohne ordnungsgemäße Validierung oder Escape-Schaltung in eine Webseite einfügt, wodurch Angreifer Skripte im Browserkontext des Opfers ausführen können. CORS ist von entscheidender Bedeutung bei der Abwehr von XSS-Angriffen, indem es kontrolliert, welche Ursprünge mit Ihrer Webanwendung interagieren dürfen.

Stellen Sie sich ein Szenario vor, in dem eine Anwendung benutzergenerierte Inhalte zulässt, die schädliche Skripts enthalten könnten.

Ohne ordnungsgemäße Inhaltsbereinigung und eine strikte CORS-Richtlinie könnte diese Anwendung zu einem Vektor für XSS-Angriffe werden. CORS verhindert XSS nicht direkt, trägt jedoch zu einer umfassenderen Sicherheitsstrategie bei, indem es sicherstellt, dass nur angegebene Ursprünge Anfragen an Ihre Anwendung stellen können, wodurch die Angriffsfläche verringert wird.

Nehmen wir zum Beispiel an, Ihre Anwendung https://safe-app.com verwendet eine API, die gehostet wird bei https://api.safe-app.comDurch die Einstellung der Access-Control-Allow-Origin Header zu https://safe-app.comstellen Sie sicher, dass nur Anfragen, die von Ihrer Anwendung stammen, auf die API zugreifen können. Diese Einschränkung trägt dazu bei, potenzielle XSS-Angriffe abzuschwächen, indem die Interaktion mit Ihrer API auf vertrauenswürdige Ursprünge beschränkt wird.

Access-Control-Allow-Origin: https://safe-app.com

Es ist jedoch wichtig, CORS-Richtlinien mit anderen Sicherheitspraktiken zu kombinieren, etwa der Validierung und Bereinigung von Benutzereingaben, um XSS und andere Arten von Angriffen wirksam abzuwehren.

Die Bedeutung strenger CORS-Richtlinien: Schutz Ihrer Webanwendungen

Die Implementierung strenger CORS-Richtlinien ist für den Schutz Ihrer Webanwendungen vor verschiedenen Sicherheitsbedrohungen von entscheidender Bedeutung. Eine laxe CORS-Richtlinie, wie das Setzen Access-Control-Allow-Origin Zu *, kann Ihre Anwendung Datendiebstahl, CSRF-Angriffen und anderen Schwachstellen aussetzen, indem es jedem Ursprung erlaubt, Anfragen an Ihren Server zu stellen.

Eine strikte CORS-Richtlinie gibt an, welche Ursprünge, Methoden und Header zulässig sind. Diese Spezifität stellt sicher, dass nur vertrauenswürdige Webanwendungen mit Ihren Ressourcen interagieren können. Dies bietet eine Sicherheitsebene, die zum Schutz vertraulicher Daten und der Anwendungsintegrität beiträgt.

Stellen Sie sich beispielsweise eine Anwendung vor, die den Zugriff von einer bestimmten Domäne aus zulässt und Anmeldeinformationen (Cookies, HTTP-Authentifizierung) verwendet:

Access-Control-Allow-Origin: https://trusted-domain.com
Access-Control-Allow-Credentials: true

Diese Konfiguration ermöglicht https://trusted-domain.com um Anfragen mit Anmeldeinformationen an Ihre Anwendung zu stellen, während Anfragen von anderen Quellen abgelehnt werden. Diese Einschränkung ist entscheidend für Anwendungen, die vertrauliche Informationen verarbeiten oder Aktionen im Namen des Benutzers ausführen.

Darüber hinaus erhöht die Angabe zulässiger Methoden und Header die Sicherheit weiter:

Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: Content-Type, X-Custom-Header

Dieses Setup stellt sicher, dass nur GET- und POST-Anfragen mit den angegebenen Headern akzeptiert werden, wodurch das Risiko nicht autorisierter oder böswilliger Anfragen verringert wird.

Best Practices für eine sichere CORS-Implementierung

  1. Zulässige Ursprünge angeben: Definieren Sie immer spezifische Ursprünge, anstatt den Platzhalter zu verwenden *. Durch dieses Vorgehen wird sichergestellt, dass nur vertrauenswürdige Domänen Anfragen an Ihre Anwendung stellen können.
  2. Beschränken Sie den Zugriff mit Anmeldeinformationen: Seien Sie vorsichtig, wenn Sie Anmeldeinformationen zulassen. Stellen Sie sicher, dass Access-Control-Allow-Credentials ist eingestellt auf true nur wenn nötig und die Ursprünge explizit definiert sind.
  3. Definieren Sie zulässige Methoden und Header: Geben Sie an, welche Methoden und Header zulässig sind. Diese Einschränkung erhöht nicht nur die Sicherheit, sondern bietet auch eine klare Dokumentation für Entwickler, die mit Ihrer API interagieren.
  4. Preflight-Anfragen verwenden: Nutzen Sie Preflight-Anfragen, um Cross-Origin-Anfragen zu überprüfen, bevor Sie sie akzeptieren. Preflight-Anfragen fügen eine zusätzliche Überprüfungsebene hinzu und stellen sicher, dass die tatsächliche Anfrage Ihrer CORS-Richtlinie entspricht.
  5. Überprüfen Sie regelmäßig die CORS-Richtlinien: Überprüfen und aktualisieren Sie im Zuge der Weiterentwicklung Ihrer Anwendung regelmäßig Ihre CORS-Richtlinien, um Änderungen in der Architektur und den Domäneninteraktionen Ihrer Anwendung zu berücksichtigen.
  6. Kombinieren Sie CORS mit anderen Sicherheitsmaßnahmen: CORS sollte Teil einer umfassenden Sicherheitsstrategie sein. Kombinieren Sie CORS-Richtlinien mit Content Security Policies (CSP), Eingabevalidierung, Ausgabecodierung und anderen bewährten Sicherheitsmethoden zum Schutz vor XSS und anderen Web-Schwachstellen.

Durch das Verständnis der Sicherheitsimplikationen von CORS und die Implementierung strenger CORS-Richtlinien können Entwickler ihre Web-Anwendungen vor Cross-Origin-Angriffen schützen und gleichzeitig die notwendigen Cross-Origin-Interaktionen ermöglichen, die moderne Web-Anwendungen erfordern.

Fortgeschrittene CORS-Themen

Da Webanwendungen immer komplexer werden, wird es immer wichtiger, die Nuancen von Cross-Origin Resource Sharing (CORS) zu verstehen. In diesem Abschnitt werden erweiterte CORS-Themen, einschließlich CORS- und API-Sicherheit, über grundlegende Konfigurationen hinaus und die Behebung häufiger Probleme behandelt.

CORS und API-Sicherheit: Sicherstellen sicherer Cross-Origin-Anfragen

APIs sind das Rückgrat moderner Webanwendungen und ermöglichen den Datenaustausch und die Funktionalität zwischen verschiedenen Diensten. CORS spielt eine zentrale Rolle bei der API-Sicherheit, indem es sicherstellt, dass nur autorisierte Quellen auf Ihre API zugreifen können. So verbessert CORS die API-Sicherheit:

  • Tokenbasierte Authentifizierung: Viele APIs verwenden tokenbasierte Authentifizierung (z. B. OAuth 2.0, JWT), um den Zugriff zu sichern. CORS-Richtlinien müssen sorgfältig konfiguriert werden, um Token-Header zuzulassen, wie z. B. Authorization, aus vertrauenswürdigen Quellen. Um beispielsweise zu ermöglichen Authorization Header in Cross-Origin-Anfragen, Ihr Server muss es explizit auflisten in Access-Control-Allow-Headers.
Access-Control-Allow-Headers: Authorization
  • API-Nutzung von Drittanbietern: Wenn Ihre Webanwendung APIs von Drittanbietern nutzt, ist es wichtig, die CORS-Richtlinien dieser APIs zu verstehen. Wenn die API von Drittanbietern eine restriktive CORS-Richtlinie hat, müssen Sie möglicherweise einen serverseitigen Proxy in Ihrer Domäne verwenden, um Anforderungen an die API weiterzuleiten und so CORS-Einschränkungen zu umgehen.
  • Benutzerdefinierte Header verfügbar machen: Wenn Ihre API benutzerdefinierte Header für anwendungsspezifische Informationen verwendet, müssen diese Header dem Client explizit zugänglich gemacht werden durch Access-Control-Expose-Headers. Dadurch kann die clientseitige Anwendung die Werte dieser Header lesen.
Access-Control-Expose-Headers: X-My-Custom-Header

Über grundlegendes CORS hinaus: Erweiterte Konfiguration und Fehlerbehebung

Erweiterte CORS-Konfigurationen können komplexere Szenarien abdecken:

  • Dynamische Ursprungsvalidierung: Für Anwendungen, die Anfragen von einem dynamischen Satz von Ursprüngen zulassen müssen (z. B. Multi-Tenant-Anwendungen, bei denen jeder Mandant seine eigene Domäne hat), ist die Implementierung einer dynamischen Ursprungsvalidierung erforderlich. Dabei wird programmgesteuert überprüft, Origin Header mit einer Liste zulässiger Ursprünge und Festlegen der Access-Control-Allow-Origin Kopfzeile entsprechend.
const allowedOrigins = ['https://tenant1.example.com', 'https://tenant2.example.com'];
const origin = request.headers.origin;
if (allowedOrigins.includes(origin)) {
    response.setHeader('Access-Control-Allow-Origin', origin);
}
  • CORS für WebSockets: Obwohl WebSockets nicht in derselben Weise CORS unterliegen wie HTTP-Anfragen, ist die Sicherung von WebSocket-Verbindungen von entscheidender Bedeutung. Es empfiehlt sich, sicherzustellen, dass die anfängliche WebSocket-Handshake-Anfrage (bei der es sich um eine HTTP-Anfrage handelt) eine ordnungsgemäße CORS-Validierung enthält.
  • Preflight-Cache-Optimierung: Der Access-Control-Max-Age Mit dem Header können Sie angeben, wie lange die Ergebnisse einer Preflight-Anforderung zwischengespeichert werden können. Durch die Optimierung dieses Werts basierend auf der Häufigkeit von CORS-Richtlinienänderungen können Sie die Anzahl der Preflight-Anforderungen verringern und so die Anwendungsleistung verbessern.
Access-Control-Max-Age: 86400

Beheben häufiger CORS-Probleme

Auch bei einer ordnungsgemäßen CORS-Einrichtung können Probleme auftreten. Hier sind Strategien zur Behebung häufiger CORS-Probleme:

  • Fehlende oder falsche CORS-Header: Stellen Sie sicher, dass Ihr Server richtig konfiguriert ist, um die erwarteten CORS-Header zu senden. Tools wie curl kann zur manuellen Überprüfung der Header verwendet werden:
curl -I -H "Origin: https://example.com" https://api.example.com/resource
  • Undurchsichtige Antworten in der JavaScript Fetch API: Wenn Sie Anfragen mit der Fetch-API stellen, kann eine undurchsichtige Antwort (eine Antwort von einer No-Cors-Anfrage) zu Problemen führen, da sie die Art der Informationen einschränkt, auf die Sie über die Antwort zugreifen können. Stellen Sie sicher, dass Sie nicht festlegen mode: 'no-cors' in Ihren Fetch-API-Anfragen, sofern dies nicht unbedingt erforderlich ist.
  • CORS-Fehler mit Anmeldeinformationen: Wenn Ihre Anfragen Anmeldeinformationen enthalten (Cookies, HTTP-Authentifizierung), stellen Sie sicher Access-Control-Allow-Credentials ist eingestellt auf true, und das Access-Control-Allow-Origin ist kein Platzhalter (*).
  • Debuggen von Preflight-Anfragen: Wenn Preflight-Anfragen fehlschlagen, überprüfen Sie, ob Ihr Server OPTIONS Anfragen korrekt beantwortet und mit den entsprechenden CORS-Headern antwortet (Access-Control-Allow-Methods, Access-Control-Allow-Headers).

Durch die Vertiefung in diese fortgeschrittenen CORS-Themen können Entwickler besser verstehen, wie sie ihre Webanwendungen für die gemeinsame Nutzung von Ressourcen zwischen verschiedenen Ursprüngen sichern und optimieren können. Ob es um API-Sicherheit, komplexe CORS-Konfigurationen oder die Behebung anspruchsvoller CORS-Probleme geht, ein tiefes Verständnis von CORS ist für die moderne Webentwicklung unerlässlich.

Abschluss

Das Verständnis von CORS ist für sichere Web-Interaktionen unerlässlich. Die korrekte Implementierung schützt Anwendungen vor Sicherheitsverletzungen, die strengen Richtlinien des Systems schützen vor XSS-Angriffen und die Erforschung fortgeschrittener Themen optimiert die Web-Entwicklung.