Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Ubah Hala Antara Domain dan Tetapkan Kuki atau Pengepala?

Bagaimana untuk Ubah Hala Antara Domain dan Tetapkan Kuki atau Pengepala?

DDD
DDDasal
2024-10-31 05:30:01314semak imbas

How to Redirect Between Domains and Set Cookies or Headers?

Bagaimana untuk mengubah hala dari satu domain ke domain lain dan menetapkan kuki atau pengepala untuk domain lain?

Seperti yang diterangkan di sini, anda tidak boleh mengubah hala ke domain lain dengan pengepala tersuai ditetapkan, tidak kira apa bahasa atau rangka kerja yang anda gunakan. Ubah hala dalam protokol HTTP pada asasnya ialah pengepala (iaitu, Lokasi) yang dikaitkan dengan respons dan ia tidak membenarkan sebarang pengepala ke lokasi sasaran ditambahkan. Apabila anda menambah pengepala Kebenaran dalam contoh anda, anda pada asasnya menetapkan pengepala itu untuk respons yang mengarahkan penyemak imbas untuk mengubah hala, bukan untuk ubah hala itu sendiri. Dalam erti kata lain, anda menghantar pengepala itu kembali kepada klien.

Bagi kuki HTTP, penyemak imbas menyimpan kuki yang dihantar oleh pelayan dengan respons (menggunakan Set-Cookie pengepala), dan kemudian menghantar kuki dengan permintaan yang dibuat ke pelayan yang sama di dalam pengepala HTTP Kuki. Seperti dalam dokumentasi:

Pengepala respons HTTP Set-Cookie digunakan untuk menghantar kuki daripada
pelayan kepada ejen pengguna, supaya ejen pengguna boleh menghantarnya semula
ke pelayan nanti. Untuk menghantar berbilang kuki, berbilang Set-Cookie
pengepala hendaklah dihantar dalam respons yang sama.

Oleh itu, jika ini adalah ubah hala daripada satu apl (dengan subdomain, cth., abc.example.test ) kepada yang lain (dengan subdomain, cth., xyz.example.test) yang kedua-duanya mempunyai domain (induk) yang sama (dan bendera domain telah ditetapkan kepada example.test apabila mencipta kuki), kuki akan berjaya dikongsi antara kedua-dua aplikasi (seolah-olah domain ditentukan, maka subdomain sentiasa disertakan). Penyemak imbas akan menyediakan kuki kepada domain yang diberikan termasuk mana-mana subdomain, tidak kira protokol (HTTP/HTTPS) atau port yang digunakan. Anda boleh mengehadkan ketersediaan kuki menggunakan bendera domain dan laluan, serta mengehadkan akses kepada kuki dengan bendera selamat dan httpSahaja (lihat di sini dan di sini, serta dokumentasi Starlette). Jika bendera httpOnly tidak ditetapkan, bakal penyerang boleh membaca dan mengubah suai maklumat melalui JavaScript (JS), manakala kuki dengan atribut httpOnly hanya dihantar ke pelayan dan tidak boleh diakses oleh JS di pihak klien.

Walau bagaimanapun, anda tidak boleh menetapkan kuki untuk domain lain. Jika ini dibenarkan, ia akan menimbulkan kecacatan keselamatan yang besar. Oleh itu, memandangkan anda "cuba mengubah hala pengguna dari satu aplikasi (domain) ke yang lain dengan beberapa set kuki,...*"", ia tidak akan berfungsi, kerana kuki hanya akan dihantar dengan permintaan yang dibuat kepada domain yang sama.

Penyelesaian 1

Penyelesaian, seperti yang diterangkan di sini, ialah mempunyai domain (apl) A mengubah hala pengguna ke domain (apl) B, dengan token akses dihantar dalam URL sebagai parameter pertanyaan. Domain B kemudiannya akan membaca token dan menetapkan kukinya sendiri, supaya penyemak imbas akan menyimpan dan menghantar kuki itu dengan setiap permintaan berikutnya ke domain B.

Sila ambil perhatian bahawa anda harus mempertimbangkan untuk menggunakan komunikasi selamat (HTTPS) , supaya token dipindahkan disulitkan, serta menetapkan bendera selamat semasa membuat kuki. Juga, ambil perhatian bahawa mempunyai token dalam rentetan pertanyaan menimbulkan risiko keselamatan yang serius, kerana data sensitif tidak boleh dihantar dalam rentetan pertanyaan. Ini kerana rentetan pertanyaan, yang merupakan sebahagian daripada URL, muncul dalam bar alamat penyemak imbas; dengan itu, membenarkan pengguna melihat dan menanda halaman URL dengan token di dalamnya (bermaksud bahawa ia disimpan pada cakera). Selain itu, URL akan sampai ke sejarah penyemakan imbas, yang bermaksud ia akan ditulis pada cakera juga dan muncul dalam tab Sejarah (tekan Ctrl H untuk melihat sejarah penyemak imbas). Kedua-dua perkara di atas akan membenarkan penyerang (dan orang yang anda kongsi komputer/peranti mudah alih) untuk mencuri data sensitif tersebut. Selain itu, banyak pemalam/sambungan penyemak imbas menjejaki aktiviti penyemakan imbas pengguna—setiap URL yang anda lawati dihantar ke pelayan mereka untuk analisis, untuk mengesan tapak web berniat jahat dan memberi amaran kepada anda terlebih dahulu. Oleh itu, anda harus mengambil kira semua perkara di atas sebelum menggunakan pendekatan di bawah (untuk siaran berkaitan mengenai subjek ini, lihat di sini, di sini dan di sini).

Untuk mengelakkan paparan URL dalam bar alamat, pendekatan di bawah menggunakan ubah hala dalam domain B juga. Setelah domain B menerima permintaan ke laluan /submit dengan token sebagai parameter pertanyaan, domain B bertindak balas dengan ubah hala ke URL kosong tanpa token di dalamnya (iaitu, halaman utamanya). Disebabkan pengalihan ini, URL dengan token di dalamnya tidak akan berakhir dalam sejarah penyemakan imbas. Walaupun ini memberikan sedikit perlindungan terhadap serangan tertentu yang diterangkan sebelum ini, ini tidak bermakna sambungan penyemak imbas, dsb., tidak akan dapat menangkap URL dengan token di dalamnya.

Jika anda menguji ini pada localhost, anda perlu memberikan aplikasi B nama domain yang berbeza; jika tidak, seperti yang dinyatakan sebelum ini, kuki akan dikongsi antara aplikasi yang mempunyai domain yang sama, dan oleh itu, anda akhirnya akan menerima kuki yang ditetapkan untuk domain A, dan tidak dapat mengetahui sama ada pendekatan itu berfungsi sama sekali. Untuk berbuat demikian, anda perlu mengedit fail /etc/hosts (pada Windows ini terletak dalam C:WindowsSystem32drivenetc) dan menetapkan nama hos kepada 127.0.0.1. Contohnya:

127.0.0.1 example.test

Anda tidak sepatutnya menambah skema atau port pada domain, serta tidak boleh menggunakan sambungan biasa, seperti .com, .net, dll., jika tidak, ia mungkin bercanggah dengan mengakses tapak web lain di Internet.

Setelah anda mengakses domain A di bawah, anda perlu mengklik pada butang hantar untuk melaksanakan permintaan POST ke laluan /submit untuk memulakan ubah hala. Satu-satunya sebab untuk permintaan POST adalah kerana anda menggunakannya dalam contoh anda dan saya mengandaikan anda perlu menyiarkan beberapa data borang. Jika tidak, anda boleh menggunakan permintaan GET juga. Dalam apl B, apabila melakukan RedirectResponse daripada laluan POST (iaitu, /serah) ke laluan GET (iaitu, /), kod status respons berubah kepada status.HTTP_303_SEE_OTHER, seperti yang diterangkan di sini, di sini dan di sini. Apl A mendengar pada port 8000, manakala apl B mendengar pada port 8001.

Jalankan kedua-dua apl di bawah, dan kemudian akses domain A di http://127.0.0.1:8000/.

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>

Penyelesaian 2

Penyelesaian lain ialah menggunakan Window.postMessage(), yang membolehkan komunikasi silang asal antara objek Window; contohnya, antara halaman dan tetingkap timbul yang dihasilkannya, atau antara halaman dan iframe yang dibenamkan di dalamnya. Contoh tentang cara menambah pendengar acara dan berkomunikasi antara tingkap boleh didapati di sini. Langkah-langkah yang perlu diikuti ialah:

Langkah 1: Tambahkan pada domain A iframe tersembunyi ke domain B. Contohnya:

<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>

Langkah 2 : Sebaik sahaja anda memperoleh token Kebenaran daripada

Atas ialah kandungan terperinci Bagaimana untuk Ubah Hala Antara Domain dan Tetapkan Kuki atau Pengepala?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn