Kako uvoziti oddaje iz javnega obrazca v zasebno omrežje
Sledite eni oddaji iz javnega obrazca od zapisa o sprejemu do zasebnega uvoznika in ohranite preverjanje, poverilnice ter obravnavo ponovitev na pravi strani.
Javni obrazec, ki nikoli ne komunicira z zasebnim omrežjem, vseeno ustvari podatke, ki jih mora zasebno omrežje presoditi. Predor spremeni le to, kdo koga pokliče. Vse po prenosu je odločitev o uvozu in pripada zasebni strani. Ta vodnik sledi eni oddaji od brskalnika do zapisanega notranjega zapisa.
Začnite tam, kjer oddaja pristane
Brskalnik pošlje na javno končno točko, ki zapiše vrstico v nadzorovano shrambo sprejema in ne vrne ničesar več kot potrditev. Ta shramba je točka predaje in bi morala biti edina stvar, v katero lahko javna raven piše. Surove podatke tam ohranite nespremenjene, skupaj s časom prihoda in stabilnim identifikatorjem zapisa.
Nato zasebni delavec potegne čakajoče vrstice skozi predor in odloči, kaj storiti z vsako. Teče pod lastno identiteto, in to je tema naslednjega razdelka.
curl --silent --fail \
--cert /etc/importer/client.crt --key /etc/importer/client.key \
"https://intake.corp.internal/api/pending?limit=20" \
-o /var/lib/importer/pending.json
Dajte uvozniku le pooblastila, ki jih potrebuje
Javni spletni proces in identiteta, ki piše v notranjo aplikacijo, bi morala biti dva različna subjekta. Javni strežnik ne potrebuje notranje administracije samo zato, ker mora dostaviti podatke obrazca, in en skupni račun za obe strani spremeni vsako spletno napako v notranji zapis. Delavcu izdajte lastne poverilnice, omejite jih na eno operacijo uvoza in beležite, kateri subjekt je izvedel vsak uvoz. Prav ta ločitev naredi mejo predora smiselno in ne okrasno.
Omejite tudi, iz katerega vira lahko delavec bere. Če izvedba uporablja čakalno vrsto ali prenosno storitev, ta storitev ohrani lastno overjanje in politiko dostopa, ker VPN ne overja ničesar znotraj vsebine.
Kratkotrajna funkcija ni izvzeta iz istega pregleda. Medtem ko teče, njena omrežna lega in poverilnice še vedno dajejo pooblastila, krajša življenjska doba pa le zoži okno. Življenjska doba ne nadomesti odločitve o tem, katere operacije lahko identiteta izvede.
Preverite, preden se karkoli notranjega spremeni
Polja javnega obrazca so besedilo pod nadzorom napadalca, dokler ni dokazano nasprotno, in smernice OWASP za preverjanje vnosa prav zato uvrščajo zaledne tokove med nezaupljive vire. Šifriran prenos pomeni, da so bajti prispeli nepoškodovani, ne pa da opisujejo dovoljeno zahtevo. Razčlenite in preverite pred vsakim privilegiranim korakom, da slaba vrstica nikoli ne doseže poti kode, ki lahko deluje.
Določite dovoljena polja, njihove oblike, njihove velikosti in poslovna pravila, ki morajo veljati. Datum je lahko pravilno oblikovan in vseeno napačen za zahtevano operacijo, vsebina, ki imenuje notranji račun ali status odobritve, pa si ne sme moči podeliti niti enega od obeh.
Zavrnjene vrstice pošljite v rezultat pregleda, namesto da ugibate popravek ali jih posredujete v lupino ali surov vmesnik podatkovne baze. Zabeležite identifikator zapisa in pravilo, ki ni uspelo, ne vsakega polja, ki ga je vpisal prosilec.
Ustvarite točko ponovitve pri eni operaciji
Če je zapis submission-1042 potegnjen dvakrat, ker se je prva potrditev izgubila, delavec potrebuje trajen način za prepoznavo izvornega zapisa in njegovega zapisanega rezultata. Urnik, ki opravilo zažene enkrat, ne dokazuje, da je bila vsaka vrstica uporabljena enkrat. Dvojna dostava je običajna, zato jo mora zasnova absorbirati.
Uporabite lastno transakcijo in mehanizem za obravnavo dvojnikov notranje aplikacije ter ohranite identifikator vira, rezultat in potrditev v enem skladnem zaporedju. Potrdite šele potem, ko je predvidena operacija zapisana ali trajno dodeljena, in nikoli ne izbrišite vrstice sprejema samo zato, ker so bili bajti preneseni.
Nato to dokažite s tremi fiksnimi primeri: veljavno vrstico, nepravilno oblikovano vrstico in istim nadzorovanim identifikatorjem vira, dostavljenim dvakrat. Vsak od njih gre skozi isto končno točko, ki jo uporablja delavec.
for f in fixtures/valid-submission.json fixtures/bad-date.json; do
curl --silent --fail --cert /etc/importer/client.crt \
-X POST --data @"$f" https://intake.corp.internal/api/records
done
curl --silent --fail --cert /etc/importer/client.crt \
-X POST --data @fixtures/valid-submission.json https://intake.corp.internal/api/records
Prvi dve vrstici se morata končati v različnih notranjih stanjih, tretja pa mora vrniti identifikator, ki je že zapisan za ta izvorni zapis, namesto da ustvari drugega. Karkoli drugega pomeni, da uvoz še ni ponovljiv.