Der Test für den privaten Netzwerkzugriff (PNA) für unsichere Kontexte wird beendet – implementieren Sie die PNA-Berechtigungsaufforderung

Yifan Luo
Yifan Luo

Chrome 124 enthält die Funktion Berechtigung für privaten Netzwerkzugriff zum Lockern gemischter Inhalte. Derzeit läuft ein Test zur Einstellung von Websites, die mehr Zeit benötigen, um sich auf diese Änderung vorzubereiten. Diese Testversion endet mit Chrome 126 und wird voraussichtlich am 4. September 2024 ausgeliefert. In diesem Beitrag wird die Änderung erläutert. Außerdem erfährst du mehr über das Design der Funktion und darüber, wie du deine aktuellen Websites migrieren und deine Implementierung testen kannst.

Was ändert sich?

Zum Herstellen von Verbindungen zu Geräten in einem privaten Netzwerk, die keine global eindeutigen Namen haben und daher keine TLS-Zertifikate erhalten können, wird mit dieser Funktion eine neue Option für fetch() eingeführt, um die Absicht eines Entwicklers zu deklarieren, mit einem solchen Gerät zu sprechen. Dazu gehört eine neue richtliniengesteuerte Funktion, mit der der Zugriff jeder Website auf diese Funktion gesteuert wird, sowie neue Header für die Preflight-Antwort des Servers, um zusätzliche Metadaten bereitzustellen.

Was ist der private Netzwerkzugriff?

Der private Netzwerkzugriff (PNA, früher bekannt als CORS-RFC1918 und kurz als „Local Network Access“) ist eine Sicherheitsfunktion, die die Fähigkeit von Websites einschränkt, Anfragen an Server in privaten Netzwerken zu senden. Dadurch werden Nutzer und interne Netzwerke vor potenziellen Angriffen wie Cross-Site Request Forgery (CSRF) geschützt. Für Chrome wurde nach und nach PNA implementiert, und der Schutz wird in kommenden Versionen erweitert.

Warum wird eine Berechtigungsaufforderung benötigt?

In Chrome 94 wurde der private Netzwerkzugriff von unsicheren öffentlichen Websites blockiert. Der laufende Test zur Einstellung des privaten Netzwerkzugriffs über unsichere Kontexte hat Herausforderungen bei der Migration betroffener Websites zu HTTPS aufgedeckt. Ein häufiges Problem ist die Migration privater Geräte zu HTTPS, die zu Verstößen gegen die Inhaltsprüfungen führen.

Zur Bewältigung dieser Herausforderung wurde im Rahmen eines Ursprungstests von Chrome 120 und in einer stabilen Version ab Chrome 124 eine neue Berechtigungsaufforderung hinzugefügt.

Wann wird eine Berechtigungsaufforderung benötigt?

Wir hatten vor, den Test zur Einstellung von unsicheren Kontexten einige Meilensteine nach Einführung der Funktion für die Berechtigungsaufforderung zu beenden. Zur Gewährleistung der Kompatibilität müssen Sie Ihre öffentlichen Websites zu HTTPS migrieren. Wenn Sie Ihren privaten Server nicht zu HTTPS migrieren können, können Sie mit der neuen Funktion für Berechtigungsaufforderungen gemischte Inhaltsprüfungen lockern.

Ein typischer Workflow für eine Anfrage für den privaten Netzwerkzugriff mit Berechtigungsaufforderung sieht so aus.

Berechtigungsaufforderung auslösen

Fügen Sie das neue Attribut targetAddressSpace als Abrufoption hinzu. In diesem Fall kann die Anfrage die Prüfung auf gemischte Inhalte überspringen.

fetch("http://router.local/ping", {
  targetAddressSpace: "private",
});

Gemäß dem Abschnitt Privater Netzwerkzugriff: Einführung von Preflights geht jeder privaten Netzwerkanfrage eine Preflight-Anfrage voraus. Diese Preflight-Anfrage enthält den neuen Header Access-Control-Request-Private-Network: true und die entsprechende Antwort muss den Header Access-Control-Allow-Private-Network: true enthalten.

Damit die neue Berechtigungsaufforderung umgesetzt werden kann, müssen die Geräte zwei neue Antwortheader enthalten: Private-Network-Access-Name und Private-Network-Access-ID.

  • Private-Network-Access-ID: Ein 48-Bit-Wert, dargestellt als 6 Hexadezimalbyte, getrennt durch Doppelpunkte.
  • Private-Network-Access-Name: Ein gültiger Name als String, der mit dem regulären ECMAScript-Ausdruck /^[a-z0-9_-.]+$/. übereinstimmt. Die maximale Länge des Namens beträgt 248 UTF-8-Codeeinheiten.
Private-Network-Access-Name: "My Smart Toothbrush"
Private-Network-Access-ID: "01:23:45:67:89:0A"

Demo

Sie können sich die Demo unter https://private-network-access-permission-test.glitch.me/ ansehen.

Sie müssen Ihren persönlichen privaten Server starten, um die Demowebsite verwenden zu können. Der private Server sollte mit dem HTTP-Header Access-Control-Allow-Private-Network: true sowie mit den vom Server angegebenen Headern Private-Network-Access-ID und Private-Network-Access-Name antworten. Wenn alles korrekt festgelegt ist, sollte die folgende Berechtigungsaufforderung angezeigt werden:

Test zur Einstellung von unsicherem Kontext beenden

Bei Websites, für die der Test zum Einstellungsprozess für den privaten Netzwerkzugriff für unsichere Kontexte registriert wurde, ist dies der richtige Zeitpunkt, um Ihre Website mit unserer neuen Berechtigungsaufforderung zu migrieren und den Test jetzt zu beenden.

Löschen Sie nach der Aktualisierung des Codes das Testtoken in den HTML-, JavaScript- oder HTTP-Headern. Wenn Sie sich nicht erinnern, wo Sie das Testtoken gespeichert haben, lesen Sie den Abschnitt Register for Einstellungstest im vorherigen Blogpost.

Sie können das Token auch auf der Seite des Testzeitraums löschen.

Nächste Schritte

Die Lösung für Anfragen von fetch() nicht zur API wird noch geprüft.

Es wurden verschiedene Lösungen getestet, z. B. die Verwendung von Service Workern oder die Erstellung eines Zieladressraums als neue Content-Security-Policy. Die endgültige Form für Anfragen von Nicht-API-fetch() wird jedoch noch geprüft.

Anfragen von Subframes werden möglicherweise in Zukunft mit Berechtigungsrichtlinien unterstützt.

In Zukunft möchten wir möglicherweise Berechtigungsrichtlinien unterstützen, um die Möglichkeit für Subframes zu lockern.

Feedback zu Anwendungsfällen für private Netzwerke

Wenn Sie eine Website in einem privaten Netzwerk hosten, das Anfragen aus öffentlichen Netzwerken benötigt, interessiert das Chrome-Team Ihr Feedback. Melden Sie ein Problem über den Chromium Issue Tracker (Komponente: Blink>SecurityFeature>CORS>PrivateNetworkAccess) oder über das GitHub-Repository.

Ressourcen