Heim  >  Artikel  >  Web-Frontend  >  Eine kurze Diskussion über Preflight-Anfragen

Eine kurze Diskussion über Preflight-Anfragen

一个新手
一个新手Original
2017-09-18 10:24:314601Durchsuche


Eine kurze Diskussion über Preflight-Anfragen

Hintergrund

Ich weiß nicht, ob Ihnen aufgefallen ist, dass wir manchmal beim Aufrufen der Hintergrundschnittstelle danach fragen Wie unten gezeigt

Eine kurze Diskussion über Preflight-Anfragen

Tatsächlich ist das erste Mal, dass die Preflight-Anfrage gesendet wird, daher wird in diesem Artikel erläutert, warum und wann die Preflight-Anfrage gesendet werden soll Eine Preflight-Anfrage wird gesendet und was wird in der Preflight-Anfrage getan?

1. Warum eine Preflight-Anfrage senden

Wir alle kennen die Same-Origin-Richtlinie des Browsers, die der Sicherheit dient Aus Gründen schränkt der Server domänenübergreifende HTTP-Anfragen ein, die von Skripten wie XMLHttpRequest und Fetch initiiert werden, die der Same-Origin-Richtlinie folgen.
Es gibt im Allgemeinen zwei Möglichkeiten für Browser, domänenübergreifende Anfragen einzuschränken:
1. Der Browser schränkt die Initiierung domänenübergreifender Anfragen ein.
2 werden vom Browser abgefangen

Im Allgemeinen beschränken Browser domänenübergreifende Anforderungen auf die zweite Art und Weise, was bedeutet, dass die Anforderung den Server erreicht hat und möglicherweise die Daten in der Datenbank verarbeitet hat, das zurückgegebene Ergebnis jedoch abgefangen wurde vom Browser, dann können wir das Rückgabeergebnis nicht abrufen. Dies ist eine fehlgeschlagene Anfrage, die jedoch Auswirkungen auf die Daten in der Datenbank haben kann.

Um dies zu verhindern, verlangt die Spezifikation, dass der Browser für diese HTTP-Anfragemethode, die Nebenwirkungen auf Serverdaten haben kann, zunächst die OPTIONS-Methode verwenden muss, um eine Preflight-Anfrage zu initiieren, um festzustellen, ob Der Server lässt die domänenübergreifende Anfrage zu: Wenn dies zulässig ist, senden Sie die echte Anfrage mit Daten. Wenn nicht, verhindern Sie, dass die echte Anfrage mit Daten gesendet wird.

2. Wann eine Preflight-Anfrage gesendet werden soll

HTTP-Anfragen umfassen: einfache Anfragen und Anfragen, die einen Preflight erfordern

Einfache Anfragen

Einfache Anfragen CORS-Preflight Anfrage wird nicht ausgelöst, „Jane gehört zu
Der Begriff „einzelne Anfrage“ gehört nicht zur Fetch-Spezifikation (wo CORS definiert ist).
Eine Anfrage kann als „einfache Anfrage“ betrachtet werden, wenn alle der folgenden Bedingungen erfüllt sind:
- Verwenden Sie eine der folgenden Methoden:
- GET
- HEAD
- POST
- Content-Type: (Nur wenn der Content-Type-Wert der POST-Methode einem der folgenden entspricht, gilt dies als einfache Anforderung)
                                                                                 -                                                                                  - - text/plain
multipart/form-data
application/x-www-form-urlencodedHinweis:

WebKit Nightly und Safari Technology Preview sind die Headerfelder Accept
, Accept-Language

und Content-Language . Werte fügen zusätzliche Einschränkungen hinzu. Wenn die Werte dieser Header-Felder „nicht standardmäßig“ sind, behandelt WebKit/Safari diese Anfragen nicht als „einfache Anfragen“. WebKit/Safari listet in der Dokumentation nicht auf, welche Werte „nicht standardmäßig“ sind, aber wir können eine Diskussion hier finden: Require preflight for non-standard CORS-safelisted request headers Accept, Accept-Language, and Content-Language, Erlauben Sie Kommas in den Anforderungsheadern Accept, Accept-Language und Content-Language für einfache CORS und wechseln Sie zu einem Blacklist-Modell für eingeschränkte Accept-Header in einfachen CORS-Anfragen. Andere Browser unterstützen diese zusätzlichen Einschränkungen nicht, da sie nicht Teil der Spezifikation sind.

2. Anfragen, die einen Preflight erfordern

„Anfragen, die einen Preflight erfordern“ erfordern, dass Sie zuerst die Methode
verwenden, um eine Preflight-Anfrage an den Servicebereich zu initiieren, um zu erfahren, ob der Server Erlauben Sie die eigentliche Anfrage. Durch den Einsatz von „Preflight Request“ kann vermieden werden, dass domänenübergreifende Anfragen unerwartete Auswirkungen auf Benutzerdaten auf dem Server haben.
Eine Preflight-Anfrage sollte zuerst gesendet werden, wenn die Anfrage eine der folgenden Bedingungen erfüllt:

- Eine der folgenden HTTP-Methoden verwendet: OPTIONS -

-

- PUT
- DELETE
- CONNECT
- OPTIONS
- Künstlich andere Headerfelder als der CORS-sichere Headerfeldsatz gesetzt. Das Set ist: TRACE -
PATCH -

- Accept
- Accept-Language
- Content-Language
- Content-Type
- DPR
- Downlink
- Save-Data
– Der Wert von Viewport-Width ist keiner der folgenden:
- - Width
- - Content-Type
- - application/x-www-form-urlencoded

Das Folgende ist eine HTTP-Anfrage, die eine Preflight-Anfrage ausführen muss:

var invocation = new XMLHttpRequest();
var url = ' 
var body = &#39;<?xml version="1.0"?><person><name>Arun</name></person>&#39;;function callOtherDomain(){
  if(invocation)
    {
      invocation.open(&#39;POST&#39;, url, true);
      invocation.setRequestHeader(&#39;X-PRODUCT&#39;, &#39;H5&#39;);
      invocation.setRequestHeader(&#39;Content-Type&#39;, &#39;application/xml&#39;);
      invocation.onreadystatechange = handler;
      invocation.send(body); 
    }
}
......

Der obige Code verwendet eine POST-Anfrage, um ein XML-Dokument zu senden, das ein benutzerdefiniertes Header-Feld enthält (X-PRODUCT: H5). Darüber hinaus lautet das Content-Type für diese Anfrage application/xml. Daher muss die Anfrage zunächst eine „Preflight-Anfrage“ initiieren.
Eine kurze Diskussion über Preflight-Anfragen

1. OPTIONS /resources/post-here/ 
2. HTTP/1.13. Host: bar.other4. User-Agent: Mozilla/5.0 (Macintosh; U; 5.Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre6. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.87. Accept-Language: en-us,en;q=0.58. Accept-Encoding: gzip,deflate9. Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.710. Connection: keep-alive11. Origin: http://foo.example12. Access-Control-Request-Method: POST13. Access-Control-Request-Headers: X-PINGOTHER, Content-Type14. HTTP/1.1 200 OK15. Date: Mon, 01 Dec 2008 01:15:39 GMT16. Server: Apache/2.0.61 (Unix)17. Access-Control-Allow-Origin: http://foo.example18. Access-Control-Allow-Methods: POST, GET, OPTIONS19. Access-Control-Allow-Headers: X-PINGOTHER, Content-Type20. Access-Control-Max-Age: 8640021. Vary: Accept-Encoding, Origin22. Content-Encoding: gzip23. Content-Length: 024. Keep-Alive: timeout=2, max=10025. Connection: Keep-Alive26. Content-Type: text/plain

Wie Sie der obigen Nachricht entnehmen können, senden die Zeilen 1 bis 12 eine Preflight-Anfrage mit der Methode OPTIONS. OPTIONS ist eine im HTTP/1.1-Protokoll definierte Methode, um weitere Informationen vom Server zu erhalten. Diese Methode hat keine Auswirkungen auf Serverressourcen. Die Anfrage trägt gleichzeitig die folgenden zwei Header-Felder:

Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PRODUCT

Das Header-Feld Access-Control-Request-Method teilt dem Server mit, dass die eigentliche Anfrage die POST-Methode verwenden wird. Das Header-Feld Access-Control-Request-Headers teilt dem Server mit, dass die eigentliche Anfrage zwei benutzerdefinierte Anfrage-Header-Felder enthält: X-PINGOTHER und Content-Type. Auf dieser Grundlage entscheidet der Server, ob die tatsächliche Anfrage zulässig ist.

Die Zeilen 14 bis 26 sind Antworten auf die Preflight-Anfrage und geben an, dass der Server bei nachfolgenden tatsächlichen Anfragen bleibt. Konzentrieren Sie sich auf die Zeilen 17–20:

Access-Control-Allow-Origin: http://foo.exampleAccess-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER, Content-TypeAccess-Control-Max-Age: 86400

Das Header-Feld Access-Control-Allow-Methods gibt an, dass der Server dem Client erlaubt, Anfragen mithilfe der Methoden POST, GET und OPTIONS zu initiieren. Das

-Header-Feld Access-Control-Allow-Headers gibt an, dass der Server die Übertragung der Felder X-PINGOTHER und Content-Type in der Anfrage zulässt. Wie Access-Control-Allow-Methods ist der Wert von Access-Control-Allow-Headers eine durch Kommas getrennte Liste.

Schließlich gibt das Header-Feld

Access-Control-Max-Age an, dass die Antwort 86400 Sekunden lang gültig ist, also 24 Stunden. Innerhalb des Gültigkeitszeitraums muss der Browser für dieselbe Anfrage keine erneute Preflight-Anfrage initiieren. Bitte beachten Sie, dass der Browser selbst eine maximale Gültigkeitsdauer einhält. Wenn der Wert dieses Header-Felds die maximale Gültigkeitsdauer überschreitet, wird es nicht wirksam.

Nachdem die Preflight-Anfrage abgeschlossen ist, senden Sie die eigentliche Anfrage:

POST /resources/post-here/ HTTP/1.1Host: bar.otherUser-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3preAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: en-us,en;q=0.5Accept-Encoding: gzip,deflateAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7Connection: keep-aliveX-PINGOTHER: pingpongContent-Type: text/xml; charset=UTF-8Referer: http://foo.example/examples/preflightInvocation.htmlContent-Length: 55Origin: http://foo.examplePragma: no-cacheCache-Control: no-cache<?xml version="1.0"?><person><name>Arun</name></person>HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 01:15:40 GMT
Server: Apache/2.0.61 (Unix)
Access-Control-Allow-Origin: http://foo.example
Vary: Accept-Encoding, Origin
Content-Encoding: gzip
Content-Length: 235
Keep-Alive: timeout=2, max=99
Connection: Keep-Alive
Content-Type: text/plain
[Some GZIP&#39;d payload]

Das obige ist der detaillierte Inhalt vonEine kurze Diskussion über Preflight-Anfragen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn