Gesaan dan konteks
Satu API pembayaran mendayakan penyambungan semula sesi TLS 1.3. Sesetengah permintaan tiba sebelum jabat tangan selesai dan get laluan mengembalikan 425 Too Early. Terangkan permintaan mana yang boleh menggunakan early data, cara mencegah kesan sampingan ulangan, cara proksi memberi isyarat mengenainya, dan bila klien boleh mencuba semula.
Perkara yang dinilai oleh penemu duga
- Memahami bahawa 0-RTT mengurangkan kependaman tetapi tidak menyediakan perlindungan ulangan seperti jabat tangan biasa.
- Membezakan 425, tamat masa rangkaian, dan penolakan perniagaan dengan betul, serta menggunakan
Early-Data: 1. - Menghubungkan kunci keidempotensan, tetingkap penyahduplikasian, dasar get laluan, dan mesin keadaan pelayan.
- Membuktikan dengan metrik dan latihan simulasi bahawa percubaan semula tidak mengenakan caj dua kali.
Soalan penjelasan
- Klien, CDN, get laluan, atau asal (origin) manakah yang menamatkan TLS dan boleh mengetahui bahawa data adalah early data?
- Adakah permintaan itu GET atau bacaan, atau adakah ia mengenakan caj, menghantar barang, memberi hak, atau menerbitkan kesan sampingan?
- Adakah terdapat kunci keidempotensan yang unik secara global, berapa lama ia disimpan, dan adakah ia dikongsi merentasi rantau?
- Adakah satu get laluan menjana 425, dan bolehkah setiap SDK memahaminya serta membina semula badan permintaan?
- Bagaimanakah tarikh akhir percubaan semula, jangka hayat pengesahan pembayaran, dan keadaan yang dapat dilihat oleh pengguna diselaraskan?
Jawapan 30 saat
0-RTT membolehkan klien penyambungan semula TLS 1.3 menghantar data aplikasi awal, tetapi penyerang boleh memainkan semula (replay) data tersebut. Pelayan harus menolak early data untuk permintaan yang mempunyai kesan sampingan; perantara yang menyokong boleh memberi isyarat dengan Early-Data: 1 dan asal boleh mengembalikan 425. Selepas jabat tangan penuh, klien mencuba semula hanya apabila ulangan adalah selamat. Untuk penulisan pembayaran, ia terlebih dahulu menyemak hasil keidempotensan atau menunggu pengesahan perniagaan; 425 bukanlah bukti bahawa caj telah gagal.
Jawapan mendalam
Langkah 1: Tentukan sempadan 0-RTT
Penyambungan semula TLS 1.3 membenarkan early data untuk menjimatkan perjalanan pergi balik (round trip). Pelayan tidak boleh menganggapnya sebagai bukti segar yang tidak boleh diulang: penyerang boleh menyalin bait yang sama dan menghantarnya semula semasa tetingkap yang dibenarkan.
Langkah 2: Klasifikasikan kesan sampingan
GET awam, pertanyaan baca sahaja, atau permintaan yang benar-benar idempoten boleh mempertimbangkan early data apabila syarat protokol dan perniagaan membenarkannya. Mengenakan caj, membuat pesanan, memberi hak, atau menerbitkan mesej harus melumpuhkannya melainkan pelayan mempunyai keidempotensan yang boleh dipercayai dan penyahduplikasian atomik.
Langkah 3: Fahami Early-Data dan 425
Perantara yang menyokong early data boleh menambah Early-Data: 1 semasa memajukannya. Asal yang tidak bersedia menerima risiko ulangan mengembalikan 425, bermakna permintaan tiba terlalu awal; klien harus menghantar semula selepas jabat tangan. Ketiadaan pengepala bukanlah bukti sifar risiko ulangan, jadi sahkan penggunaan (deployment) yang lengkap.
Langkah 4: Reka bentuk dasar get laluan
Get laluan mengekalkan senarai dibenarkan mengikut kaedah, laluan, dan jenis pengesahan. Ia menolak early data pada laluan pembayaran, inventori, dan perubahan kebenaran, sambil merekodkan keadaan sambungan untuk laluan bacaan. Ia mesti mengekalkan 425 dan bukannya menulis semula kepada 500 generik.
Langkah 5: Reka bentuk keidempotensan dan penyahduplikasian
Klien mencipta kunci yang tidak dapat diramalkan untuk setiap niat perniagaan. Pelayan secara atomik melakukan komit terhadap kesan sampingan dan hasil penyahduplikasian, atau menggunakan sempadan atomik yang setara. Kunci pendua mengembalikan hasil pertama dan tidak akan mengenakan caj lagi. TTL meliputi percubaan semula rangkaian maksimum, kelewatan giliran, dan penyelarasan.
Langkah 6: Nyatakan percubaan semula yang selamat
Selepas 425, wujudkan sambungan penuh dan hantar semula hanya semasa tarikh akhir masih sah dan badan permintaan boleh dibina semula. GET boleh mencuba semula secara automatik. Permintaan pembayaran dengan kunci keidempotensan membaca keadaannya terlebih dahulu; penulisan tanpa perlindungan ulangan pergi ke pengesahan perniagaan. Hadkan percubaan semula bagi setiap niat dan gunakan undur masa (backoff).
Langkah 7: Sahkan dan perhatikan
Rekod volum early data, kadar 425, kadar percubaan semula mengikut laluan, kunci pendua, caj yang berjaya, dan perbezaan penyelarasan. Suntik kegagalan proksi dan klien untuk menguji penolakan, percubaan semula jabat tangan penuh, tamat masa, penghantaran pendua, dan penyahduplikasian rentas rantau. Penerimaan mesti menunjukkan paling banyak satu kesan sampingan bagi setiap niat perniagaan.
Jawapan model
Saya akan meletakkan penulisan pembayaran pada senarai penolakan early data. Jika penamat TLS menerima early data, ia memajukan Early-Data: 1; asal mengembalikan 425 untuk penulisan tersebut dan menyimpan ID permintaan diagnostik. Selepas jabat tangan penuh, klien tidak mengulang secara membuta tuli: ia menanyakan pesanan atau caj mengikut kunci keidempotensan dan mencuba semula sekali sahaja apabila keadaan tidak diketahui dan tarikh akhir membenarkan. Pelayan menyimpan kunci, hasil perniagaan, dan rekod penyahduplikasian secara atomik, dengan sempadan rentas rantau. GET baca sahaja boleh mencuba semula secara automatik. Saya memantau 425, kunci pendua, dan perbezaan penyelarasan, serta menjalankan latihan pada laluan untuk membuktikan tiada caj berganda.
Kesilapan biasa
- Menganggap TLS 1.3 0-RTT adalah selamat daripada ulangan secara automatik.
- Mencuba semula 425 selama-lamanya atau menulisnya semula sebagai 500.
- Menentukan keselamatan hanya daripada kaedah HTTP; sesetengah GET masih menyebabkan kesan sampingan.
- Menyimpan kunci keidempotensan hanya pada klien tanpa penyahduplikasian atomik pada pelayan.
- Menganggap tamat masa sebagai bukti bahawa pelayan tidak melakukan apa-apa dan bukannya menanyakan keadaan.
Soalan dan jawapan susulan
Susulan 1: Bagaimanakah 425 berbeza daripada 503?
425 menangani risiko ulangan dalam early data dan menjemput penilaian semula selepas jabat tangan penuh. 503 bermaksud ketidaktersediaan perkhidmatan sementara; dasar percubaan semulanya bergantung pada kapasiti dan Retry-After.
Susulan 2: Siapa yang menambah Early-Data?
Perantara yang memahami mekanisme ini menambah Early-Data: 1 semasa memajukan early data ke asal. Sahkan titik penamatan TLS dan pastikan proksi tidak menggugurkan atau memalsukan isyarat tersebut.
Susulan 3: Adakah kunci keidempotensan mencukupi untuk pembayaran 0-RTT?
Tidak. Kunci mestilah tidak dapat diramalkan, disimpan secara atomik bersama hasilnya, dinyahduplikasi merentasi rantau yang diperlukan, disimpan cukup lama, dan terbukti mengembalikan hasil yang sama pada pendua.
Susulan 4: Mengapa membuat pertanyaan selepas tamat masa klien?
Tamat masa hanya membuktikan bahawa klien tidak melihat respons. Menanyakan keadaan keidempotensan membezakan antara berjaya, sedang diproses, dan tidak dilaksanakan, mengelakkan caj kali kedua.
Susulan 5: Bagaimanakah anda akan melaksanakan ujian kenari (canary)?
Mulakan dengan laluan baca sahaja dan kohort klien yang kecil. Jejaki 425 dan kejayaan percubaan semula mengikut laluan; lumpuhkan early data secara automatik apabila terdapat kesan sampingan pendua, anomali penyelarasan, atau isyarat proksi yang hilang.