Vieša forma, kuri niekada nesusisiekia su privačiu tinklu, vis tiek sukuria duomenis, kuriuos privatus tinklas turi įvertinti. Tunelis tik pakeičia, kas kam skambina. Viskas po atsisiuntimo yra importo sprendimas, ir jis priklauso privačiai pusei. Ši apžvalga seka vieną pateikimą nuo naršyklės iki įrašyto vidinio įrašo.

Pradėkite ten, kur patenka pateikimas

Naršyklė siunčia užklausą į viešą galinį tašką, kuris įrašo eilutę į kontroliuojamą priėmimo saugyklą ir grąžina ne daugiau nei patvirtinimą. Ta saugykla yra perdavimo taškas, ir ji turėtų būti vienintelis dalykas, į kurį viešas sluoksnis gali rašyti. Laikykite neapdorotus duomenis ten nepakeistus, kartu su atvykimo laiku ir stabiliu įrašo identifikatoriumi.

Tada privatus darbininkas per tunelį ištraukia laukiančias eilutes ir nusprendžia, ką daryti su kiekviena. Jis veikia savo tapatybės vardu, ir tai yra kitos dalies tema.

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

Suteikite importuotojui tik reikalingus įgaliojimus

Viešas žiniatinklio procesas ir tapatybė, kuri rašo į vidinę programą, turėtų būti du skirtingi subjektai. Viešam serveriui nereikia vidinės administracijos vien todėl, kad jis turi pristatyti formos duomenis, o viena bendra paskyra abiem pusėms bet kokią žiniatinklio klaidą paverčia vidiniu įrašu. Išduokite darbininkui jo paties prisijungimo duomenis, apribokite juos viena importo operacija ir užrašykite, kuris subjektas atliko kiekvieną importą. Būtent šis atskyrimas daro tunelio ribą prasmingą, o ne dekoratyvią.

Taip pat apribokite, iš kokio šaltinio darbininkas gali skaityti. Jei įgyvendinimas naudoja eilę arba perdavimo paslaugą, ta paslauga išlaiko savo autentifikavimą ir prieigos politiką, nes VPN neautentifikuoja nieko, kas yra duomenų viduje.

Trumpalaikė funkcija nėra atleista nuo tos pačios peržiūros. Kol ji veikia, jos tinklo padėtis ir prisijungimo duomenys vis tiek suteikia įgaliojimus, o trumpesnis gyvavimo laikas tik susiaurina langą. Gyvavimo laikas nepakeičia sprendimo, kokias operacijas tapatybė gali atlikti.

Patikrinkite, kol nieko vidinio nepasikeitė

Viešos formos laukai yra užpuoliko valdomas tekstas, kol neįrodyta priešingai, ir OWASP įvesties tikrinimo gairės būtent todėl priskiria užpakalinės dalies srautus nepatikimiems šaltiniams. Šifruotas perdavimas reiškia, kad baitai atvyko nepažeisti, o ne kad jie apibūdina leistiną užklausą. Analizuokite ir tikrinkite prieš bet kurį privilegijuotą veiksmą, kad bloga eilutė niekada nepasiektų kodo kelio, galinčio veikti.

Apibrėžkite leidžiamus laukus, jų formatus, dydžius ir verslo taisykles, kurių reikia laikytis. Data gali būti taisyklingos formos ir vis tiek netinkama prašomai operacijai, o duomenys, kurie nurodo vidinę paskyrą arba patvirtinimo būseną, neturi galėti patys sau suteikti nė vieno iš jų.

Atmestas eilutes siųskite į peržiūros rezultatą, o ne spėliokite pataisymą arba persiųskite jas į apvalkalą ar neapdorotos duomenų bazės sąsają. Registruokite įrašo identifikatorių ir nepavykusią taisyklę, o ne kiekvieną lauką, kurį pareiškėjas įvedė.

Sukurkite pakartojimo tašką vienoje operacijoje

Jei įrašas submission-1042 ištraukiamas du kartus, nes pirmasis patvirtinimas buvo prarastas, darbininkui reikia patikimo būdo atpažinti šaltinio įrašą ir jo įrašytą rezultatą. Tvarkaraštis, kuris užduotį vykdo vieną kartą, neįrodo, kad kiekviena eilutė buvo pritaikyta vieną kartą. Dvigubas pristatymas yra normalus, todėl dizainas turi jį absorbuoti.

Naudokite vidinės programos pačios transakciją ir dublikatų apdorojimo mechanizmą bei laikykite šaltinio identifikatorių, rezultatą ir patvirtinimą vienoje nuoseklioje sekoje. Patvirtinkite tik po to, kai numatyta operacija įrašyta arba patikimai priskirta, ir niekada netrinkite priėmimo eilutės vien todėl, kad baitai buvo atsisiųsti.

Tada įrodykite tai trimis fiksuotais duomenų rinkiniais: galiojančia eilute, netaisyklinga eilute ir tuo pačiu kontroliuojamu šaltinio identifikatoriumi, pateiktu du kartus. Kiekvienas iš jų praeina per tą patį galinį tašką, kurį naudoja darbininkas.

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

Pirmosios dvi eilutės turi baigtis skirtingose vidinėse būsenose, o trečioji turi grąžinti identifikatorių, jau įrašytą tam šaltinio įrašui, o ne sukurti antrą. Bet kas kita reiškia, kad importas dar nėra pakartojamas.

Susiję straipsniai