Julkinen lomake, joka ei koskaan puhu yksityiselle verkolle, tuottaa silti dataa, jota yksityisen verkon on arvioitava. Tunneli muuttaa vain sitä, kuka kenelle soittaa. Kaikki latauksen jälkeen on tuontipäätös, ja se kuuluu yksityiselle puolelle. Tämä läpikäynti seuraa yhtä lähetystä selaimesta vahvistettuun sisäiseen tietueeseen.

Aloita siitä, mihin lähetys laskeutuu

Selain lähettää julkiseen päätepisteeseen, joka kirjoittaa rivin valvottuun vastaanottovarastoon eikä palauta muuta kuin kuittauksen. Tämä varasto on luovutuspiste, ja sen pitäisi olla ainoa asia, johon julkinen kerros voi kirjoittaa. Pidä raaka hyötykuorma siellä muuttumattomana yhdessä saapumisajan ja vakaan tietuetunnisteen kanssa.

Sen jälkeen yksityinen työntekijä vetää odottavat rivit tunnelin läpi ja päättää, mitä kullekin tehdään. Se toimii oman identiteettinsä alla, mikä on seuraavan osion aihe.

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

Anna tuojalle vain se valtuus, jonka se tarvitsee

Julkisen verkkoprosessin ja sisäiseen sovellukseen kirjoittavan identiteetin tulisi olla kaksi eri päämiehen. Julkinen palvelin ei tarvitse sisäistä hallintaa vain siksi, että sen on toimitettava lomakedataa, ja yksi jaettu tili molemmille puolille tekee mistä tahansa verkkohäiriöstä sisäisen kirjoituksen. Myönnä työntekijälle omat tunnistetiedot, rajaa ne yhteen tuontitoimenpiteeseen ja kirjaa, mikä päämies teki minkäkin tuonnin. Juuri tämä erottelu tekee tunnelin rajasta merkityksellisen eikä koristeellisen.

Rajoita myös sitä, mistä lähteestä työntekijä saa lukea. Jos toteutus käyttää jonoa tai siirtopalvelua, kyseinen palvelu säilyttää oman todentamisensa ja käyttöoikeuspolitiikkansa, koska VPN ei todista mitään hyötykuorman sisällä.

Lyhytaikainen funktio ei ole vapautettu samasta tarkastelusta. Kun se toimii, sen verkkosijainti ja tunnistetiedot antavat yhä valtuuden, ja lyhyempi elinikä vain kaventaa ikkunaa. Elinikä ei korvaa päätöstä siitä, mitä toimintoja identiteetti saa suorittaa.

Validoi ennen kuin mikään sisäinen muuttuu

Julkisten lomakkeiden kentät ovat hyökkääjän hallitsemaa tekstiä, kunnes toisin todistetaan, ja OWASP:n syötteen validoinnin ohjeet laskevat taustavirrat epäluotettaviin lähteisiin juuri tästä syystä. Salattu siirto kertoo, että tavut saapuivat ehjinä, ei että ne kuvaavat sallittua pyyntöä. Jäsennä ja validoi ennen jokaista etuoikeutettua vaihetta, jotta huono rivi ei koskaan päädy koodipolulle, joka voi toimia.

Määrittele sallitut kentät, niiden muodot, koot ja liiketoimintasäännöt, joiden on oltava voimassa. Päiväys voi olla hyvin muotoiltu ja silti väärä pyydetylle toimenpiteelle, eikä hyötykuorma, joka nimeää sisäisen tilin tai hyväksyntätilan, saa pystyä myöntämään itselleen kumpaakaan.

Lähetä hylätyt rivit katselmoinnin tulokseen sen sijaan, että arvaisit korjauksen tai välittäisit ne kuorelle tai raakaan tietokantaliittymään. Kirjaa tietuetunniste ja epäonnistunut sääntö, älä jokaista kenttää, jonka hakija kirjoitti.

Tee uudelleenyrityspiste yhdestä toimenpiteestä

Jos tietue submission-1042 vedetään kahdesti, koska ensimmäinen kuittaus katosi, työntekijä tarvitsee pysyvän tavan tunnistaa lähdetietue ja sen vahvistettu tulos. Aikataulu, joka ajaa työn kerran, ei todista, että jokainen rivi sovellettiin kerran. Kaksinkertainen toimitus on normaalia, joten suunnittelun on otettava se vastaan.

Käytä sisäisen sovelluksen omaa transaktio- ja kaksoiskappaleiden käsittelymekanismia ja pidä lähdetunniste, tulos ja kuittaus yhdessä yhtenäisessä järjestyksessä. Vahvista vasta kun aiottu toimenpide on vahvistettu tai pysyvästi osoitettu, äläkä koskaan poista vastaanottoriviä vain siksi, että tavut ladattiin.

Todista se sitten kolmella testitiedostolla: kelvollinen rivi, virheellinen rivi ja sama valvottu lähdetunniste kahdesti toimitettuna. Jokainen kulkee saman päätepisteen kautta, jota työntekijä käyttää.

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

Kahden ensimmäisen rivin on päädyttävä eri sisäisiin tiloihin, ja kolmannen on palautettava kyseiselle lähdetietueelle jo vahvistettu tunniste sen sijaan, että se loisi toisen. Mikä tahansa muu tarkoittaa, että tuonti ei ole vielä toistettavissa.

Aiheeseen liittyvät artikkelit