Veřejný formulář, který s privátní sítí nikdy nekomunikuje, přesto vytváří data, o kterých musí privátní síť rozhodnout. Tunel mění jen to, kdo komu volá. Všechno po stažení je rozhodnutí o importu a patří privátní straně. Tento postup sleduje jedno odeslání od prohlížeče až k potvrzenému internímu záznamu.

Začněte tam, kde odeslání přistane

Prohlížeč odesílá na veřejný koncový bod, který zapíše řádek do kontrolovaného úložiště příjmu a nevrátí nic víc než potvrzení. Toto úložiště je místem předání a mělo by být jediné, kam veřejná vrstva může zapisovat. Uchovávejte tam surová data nezměněná, spolu s časem jejich příchodu a stabilním identifikátorem záznamu.

Poté privátní pracovník stahuje čekající řádky tunelem a rozhoduje, co s každým z nich udělá. Běží pod vlastní identitou, což je tématem následující části.

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

Dejte importéru jen ta oprávnění, která potřebuje

Veřejný webový proces a identita, která zapisuje do interní aplikace, by měly být dva různé subjekty. Veřejný server nepotřebuje interní správu jen proto, že musí doručit data formuláře, a jeden sdílený účet pro obě strany promění jakoukoli webovou chybu v interní zápis. Vydělte pracovníkovi vlastní přihlašovací údaje, omezte je na jedinou operaci importu a zaznamenejte, který subjekt každý import provedl. Právě toto oddělení dělá hranici tunelu smysluplnou, a ne dekorativní.

Omezte také, ze kterého zdroje smí pracovník číst. Pokud implementace používá frontu nebo přenosovou službu, tato služba si ponechává vlastní autentizaci a přístupovou politiku, protože VPN neautentizuje nic uvnitř datového obsahu.

Krátkodobá funkce není z téže kontroly vyňata. Dokud běží, její síťová pozice a její přihlašovací údaje stále udělují oprávnění a kratší životnost jen zužuje okno. Životnost nenahrazuje rozhodnutí o tom, které operace smí identita provádět.

Validujte, než se cokoli interního změní

Pole veřejných formulářů jsou text pod kontrolou útočníka, dokud se neprokáže opak, a pokyny OWASP k validaci vstupu právě proto řadí backendové toky mezi nedůvěryhodné zdroje. Šifrovaný přenos říká, že bajty dorazily neporušené, ne že popisují povolený požadavek. Parsujte a validujte před každým privilegovaným krokem, aby se špatný řádek nikdy nedostal do cesty kódu, která může jednat.

Definujte povolená pole, jejich formáty, velikosti a obchodní pravidla, která musí platit. Datum může být správně zformované a přesto chybné pro požadovanou operaci a datový obsah, který uvádí interní účet nebo stav schválení, si nesmí být schopen přidělit ani jedno z toho.

Odmítnuté řádky posílejte na výsledek revize, místo abyste hádali opravu nebo je přeposílali do shellu či surového rozhraní databáze. Zaznamenejte identifikátor záznamu a pravidlo, které selhalo, ne každé pole, které žadatel vyplnil.

Vytvořte bod opakování u jedné operace

Pokud je záznam submission-1042 stažen dvakrát, protože se ztratilo první potvrzení, potřebuje pracovník trvalý způsob, jak rozpoznat zdrojový záznam a jeho potvrzený výsledek. Rozvrh, který úlohu spustí jednou, nedokazuje, že každý řádek byl aplikován jednou. Duplicitní doručení je běžné, takže návrh jej musí absorbovat.

Použijte vlastní mechanismus transakcí a zpracování duplikátů interní aplikace a držte identifikátor zdroje, výsledek i potvrzení v jednom soudržném sledu. Potvrzujte až poté, co je zamýšlená operace potvrzena nebo trvale přiřazena, a nikdy nemažte řádek příjmu jen proto, že byly bajty staženy.

Pak to dokažte třemi testovacími soubory: platný řádek, poškozený řádek a stejný kontrolovaný identifikátor zdroje doručený dvakrát. Každý prochází stejným koncovým bodem, který pracovník používá.

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

První dva řádky musí skončit v různých interních stavech a třetí musí vrátit identifikátor už potvrzený pro tento zdrojový záznam, místo aby vytvořil druhý. Cokoli jiného znamená, že import zatím není opakovatelný.

Související články