Јавни образац који никада не разговара са приватном мрежом ипак производи податке које приватна мрежа мора да процени. Тунел мења само то ко кога позива. Све после преузимања је одлука о увозу и припада приватној страни. Овај водич прати једну пријаву од прегледача до забележеног интерног записа.

Почните тамо где пријава слеће

Прегледач шаље на јавну крајњу тачку, која уписује ред у контролисано складиште пријема и не враћа ништа више од потврде. То складиште је тачка предаје и требало би да буде једино у шта јавни слој може да уписује. Држите сирови садржај тамо непромењен, заједно са временом доласка и стабилним идентификатором записа.

Затим приватни радник повлачи редове на чекању кроз тунел и одлучује шта ће са сваким. Ради под сопственим идентитетом, а то је тема следећег одељка.

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

Дајте увознику само овлашћења која су му потребна

Јавни веб процес и идентитет који уписује у интерну апликацију требало би да буду два различита субјекта. Јавном серверу није потребна интерна администрација само зато што мора да достави податке обрасца, а један дељени налог за обе стране претвара сваку веб грешку у интерни упис. Издајте раднику сопствене акредитиве, ограничите их на једну операцију увоза и бележите који је субјект извршио сваки увоз. То раздвајање чини границу тунела смисленом, а не украсном.

Ограничите и из ког извора радник може да чита. Ако имплементација користи ред или сервис за пренос, тај сервис задржава сопствену аутентификацију и политику приступа, јер VPN не аутентификује ништа унутар садржаја.

Функција кратког трајања није изузета од истог прегледа. Док ради, њен мрежни положај и акредитиви и даље дају овлашћења, а краћи животни век само сужава прозор. Животни век није замена за одлуку о томе које операције идентитет може да изврши.

Валидирајте пре него што се било шта интерно промени

Поља јавног обрасца су текст под контролом нападача док се не докаже супротно, и OWASP смернице за валидацију уноса управо због тога сврставају бекенд токове међу непоуздане изворе. Шифровани пренос каже да су бајтови стигли неоштећени, а не да описују дозвољен захтев. Парсирајте и валидирајте пре сваког привилегованог корака, тако да лош ред никада не стигне до путање кода која може да делује.

Дефинишите дозвољена поља, њихове формате, величине и пословна правила која морају да важе. Датум може бити исправно форматиран и ипак погрешан за тражену операцију, а садржај који именује интерни налог или статус одобрења не сме себи моћи да додели ни једно ни друго.

Одбијене редове шаљите у резултат прегледа уместо да нагађате исправку или их прослеђујете у шкољку или сирови интерфејс базе података. Бележите идентификатор записа и правило које није прошло, а не свако поље које је подносилац откуцао.

Направите тачку поновног покушаја на једној операцији

Ако се запис submission-1042 повуче двапут јер је прва потврда изгубљена, раднику је потребан трајан начин да препозна изворни запис и његов забележен резултат. Распоред који посао покрене једном не доказује да је сваки ред примењен једном. Дупла достава је нормална, па дизајн мора да је апсорбује.

Користите сопствену трансакцију и механизам за обраду дупликата интерне апликације и држите идентификатор извора, резултат и потврду у једном кожерентном низу. Потврдите тек када је намеравана операција забележена или трајно додељена и никада не бришите ред пријема само зато што су бајтови преузети.

Затим то докажите са три фиксна примера: исправан ред, погрешно форматиран ред и исти контролисани идентификатор извора достављен двапут. Сваки од њих пролази кроз исту крајњу тачку коју радник користи.

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

Прва два реда морају да заврше у различитим интерним стањима, а трећи мора да врати идентификатор који је већ забележен за тај изворни запис уместо да створи други. Било шта друго значи да увоз још није поновљив.

Повезани чланци