Heim >Backend-Entwicklung >Python-Tutorial >Wie leitet man zwischen Domänen um und setzt Cookies oder Header?

Wie leitet man zwischen Domänen um und setzt Cookies oder Header?

DDD
DDDOriginal
2024-10-31 05:30:01391Durchsuche

How to Redirect Between Domains and Set Cookies or Headers?

Wie leite ich von einer Domain zu einer anderen um und setze Cookies oder Header für die andere Domain?

Wie hier beschrieben, können Sie nicht zu einer anderen Domain umleiten, wenn benutzerdefinierte Header festgelegt sind. Egal welche Sprache oder welches Framework Sie verwenden. Bei einer Umleitung im HTTP-Protokoll handelt es sich grundsätzlich um einen Header (d. h. Standort), der mit der Antwort verknüpft ist, und das Hinzufügen von Headern zum Zielort ist nicht möglich. Wenn Sie in Ihrem Beispiel den Authorization-Header hinzufügen, legen Sie diesen Header grundsätzlich für die Antwort fest, die den Browser zur Umleitung anweist, und nicht für die Weiterleitung selbst. Mit anderen Worten, Sie senden diesen Header zurück an den Client.

Was die HTTP-Cookies betrifft, speichert der Browser die vom Server mit der Antwort gesendeten Cookies (mithilfe des Set-Cookie Header) und sendet die Cookies später mit Anfragen an den gleichen Server innerhalb eines Cookie-HTTP-Headers. Gemäß der Dokumentation:

Der Set-Cookie-HTTP-Antwortheader wird verwendet, um ein Cookie vom
Server an den Benutzeragenten zu senden, damit der Benutzeragent es zurück
an den Server senden kann später. Um mehrere Cookies zu senden, sollten mehrere Set-Cookie
Header in derselben Antwort gesendet werden.

Wenn es sich also um eine Umleitung von einer App handelte (mit Subdomäne, z. B. abc.example.test ) zu einer anderen (mit Unterdomäne, z. B. xyz.example.test), die beide dieselbe (übergeordnete) Domäne haben (und das Domänen-Flag beim Erstellen der Cookies auf example.test gesetzt wurde), würden Cookies erfolgreich zwischen den geteilt werden zwei Apps (wenn eine Domäne angegeben ist, sind Subdomänen immer enthalten). Der Browser stellt der angegebenen Domain einschließlich aller Subdomains ein Cookie zur Verfügung, unabhängig davon, welches Protokoll (HTTP/HTTPS) oder Port verwendet wird. Sie können die Verfügbarkeit eines Cookies mithilfe der Flags „Domäne“ und „Pfad“ einschränken sowie den Zugriff auf das Cookie mit den Flags „Secure“ und „httpOnly“ einschränken (siehe hier und hier sowie in der Starlette-Dokumentation). Wenn das httpOnly-Flag nicht gesetzt ist, kann ein potenzieller Angreifer die Informationen über JavaScript (JS) lesen und ändern, wohingegen ein Cookie mit dem httpOnly-Attribut nur an den Server gesendet wird und für JS auf der Clientseite nicht zugänglich ist.

Sie können jedoch keine Cookies für eine andere Domain setzen. Würde dies zugelassen, würde dies eine enorme Sicherheitslücke darstellen. Da Sie also "versuchen, den Benutzer mit einem gesetzten Cookie von einer Anwendung (Domäne) zu einer anderen umzuleiten,...*"", würde dies nicht funktionieren, da das Cookie nur gesendet wird mit Anfragen an dieselbe Domain.

Lösung 1

Eine Lösung, wie hier beschrieben, besteht darin, dass Domäne (App) A den Benutzer zu Domäne (App) B umleitet, wobei das Zugriffstoken in der URL als Abfrageparameter übergeben wird. Domäne B würde dann das Token lesen und ein eigenes Cookie setzen, sodass der Browser dieses Cookie speichert und bei jeder weiteren Anfrage an Domäne B sendet.

Bitte beachten Sie, dass Sie die Verwendung einer sicheren (HTTPS) Kommunikation in Betracht ziehen sollten , damit das Token verschlüsselt übertragen wird, sowie das Setzen des Secure Flags beim Erstellen des Cookies. Beachten Sie außerdem, dass das Vorhandensein des Tokens in der Abfragezeichenfolge ein ernstes Sicherheitsrisiko darstellt, da vertrauliche Daten niemals in der Abfragezeichenfolge übergeben werden sollten. Dies liegt daran, dass die Abfragezeichenfolge, die Teil der URL ist, in der Adressleiste des Browsers angezeigt wird. Dadurch kann der Benutzer die URL mit dem darin enthaltenen Token sehen und mit einem Lesezeichen versehen (was bedeutet, dass es auf der Festplatte gespeichert ist). Außerdem gelangt die URL in den Browserverlauf, was bedeutet, dass sie trotzdem auf die Festplatte geschrieben und auf der Registerkarte „Verlauf“ angezeigt wird (drücken Sie Strg H, um den Browserverlauf anzuzeigen). Beides würde es Angreifern (und Personen, mit denen Sie den Computer/das mobile Gerät teilen) ermöglichen, solche sensiblen Daten zu stehlen. Darüber hinaus verfolgen viele Browser-Plugins/-Erweiterungen die Surfaktivitäten der Benutzer. Jede von Ihnen besuchte URL wird zur Analyse an deren Server gesendet, um bösartige Websites zu erkennen und Sie im Voraus zu warnen. Daher sollten Sie alle oben genannten Punkte berücksichtigen, bevor Sie den folgenden Ansatz verwenden (verwandte Beiträge zu diesem Thema finden Sie hier, hier und hier).

Um zu verhindern, dass die URL in der Adressleiste angezeigt wird, verwenden Sie den folgenden Ansatz nutzt auch eine Umleitung innerhalb der Domäne B. Sobald Domäne B die Anfrage an die Route /submit mit dem Token als Abfrageparameter erhält, antwortet Domäne B mit einer Umleitung zu einer bloßen URL ohne Token (d. h. ihrer Homepage). Aufgrund dieser Umleitung würde die URL mit dem darin enthaltenen Token nicht im Browserverlauf landen. Obwohl dies einen gewissen Schutz vor bestimmten, zuvor beschriebenen Angriffen bietet, bedeutet dies nicht, dass Browsererweiterungen usw. nicht immer noch in der Lage sind, die URL mit dem darin enthaltenen Token zu erfassen.

Wenn Sie dies testen Auf localhost müssen Sie der Anwendung B einen anderen Domänennamen geben. Andernfalls werden Cookies, wie bereits erwähnt, von Anwendungen mit derselben Domäne gemeinsam genutzt, sodass Sie am Ende die für Domäne A festgelegten Cookies erhalten und nicht feststellen können, ob der Ansatz überhaupt funktioniert. Dazu müssen Sie die Datei /etc/hosts bearbeiten (unter Windows befindet sich diese in C:WindowsSystem32driversetc) und 127.0.0.1 einen Hostnamen zuweisen. Zum Beispiel:

127.0.0.1 example.test

Sie sollten das Schema oder den Port nicht zur Domäne hinzufügen und keine gängigen Erweiterungen wie .com, .net usw. verwenden, da es sonst zu Konflikten kommen kann beim Zugriff auf andere Websites im Internet.

Sobald Sie unten auf Domäne A zugreifen, müssen Sie auf die Schaltfläche „Senden“ klicken, um eine POST-Anfrage an die Route „/submit“ durchzuführen und die Umleitung zu starten. Der einzige Grund für die POST-Anfrage besteht darin, dass Sie sie in Ihrem Beispiel verwenden und ich davon ausgehe, dass Sie einige Formulardaten posten müssen. Andernfalls könnten Sie auch eine GET-Anfrage verwenden. Wenn in App B eine RedirectResponse von einer POST-Route (d. h. /submit) zu einer GET-Route (d. h. /) ausgeführt wird, ändert sich der Antwortstatuscode in status.HTTP_303_SEE_OTHER, wie hier, hier und hier beschrieben. App A überwacht Port 8000, während App B Port 8001 überwacht.

Führen Sie beide Apps unten aus und greifen Sie dann auf Domäne A unter http://127.0.0.1:8000/ zu.

appA.py

127.0.0.1 example.test

appB.py

<code class="python">from fastapi import FastAPI, FastAPI
from fastapi.responses import RedirectResponse, HTMLResponse
import uvicorn

app = FastAPI()
           
@app.get('/', response_class=HTMLResponse)
def home():
    return """"
    <!DOCTYPE html>
    <html>
       <body>
          <h2>Click the "submit" button to be redirected to domain B</h2>
          <form method="POST" action="/submit">
             <input type="submit" value="Submit">
          </form>
       </body>
    </html>
    """
        
@app.post("/submit")
def submit():
    token = 'MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3'
    redirect_url = f'http://example.test:8001/submit?token={token}'
    response = RedirectResponse(redirect_url)
    response.set_cookie(key='access-token', value=token, httponly=True)  # set cookie for domain A too
    return response
 
if __name__ == '__main__':
    uvicorn.run(app, host='0.0.0.0', port=8000)</code>

Lösung 2

Eine andere Lösung wäre die Verwendung von Window.postMessage(), was eine ursprungsübergreifende Kommunikation zwischen Window-Objekten ermöglicht; zum Beispiel zwischen einer Seite und einem Pop-up, das sie erzeugt hat, oder zwischen einer Seite und einem darin eingebetteten Iframe. Beispiele zum Hinzufügen von Ereignis-Listenern und zur Kommunikation zwischen den Fenstern finden Sie hier. Die folgenden Schritte wären:

Schritt 1:Fügen Sie zu Domäne A einen versteckten Iframe zu Domäne B hinzu. Beispiel:

<code class="python">from fastapi import FastAPI, Request, status
from fastapi.responses import RedirectResponse
import uvicorn

app = FastAPI()

@app.get('/')
def home(request: Request):
    token = request.cookies.get('access-token')
    print(token)
    return 'You have been successfully redirected to domain B!' \
           f' Your access token ends with: {token[-4:]}'
 
@app.post('/submit')
def submit(request: Request, token: str):
    redirect_url = request.url_for('home')
    response = RedirectResponse(redirect_url, status_code=status.HTTP_303_SEE_OTHER)
    response.set_cookie(key='access-token', value=token, httponly=True)
    return response
 
if __name__ == '__main__':
    uvicorn.run(app, host='0.0.0.0', port=8001)</code>

Schritt 2 : Sobald Sie das Autorisierungstoken vom

erhalten

Das obige ist der detaillierte Inhalt vonWie leitet man zwischen Domänen um und setzt Cookies oder Header?. 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