Հանրային ձևաթուղթը, որը երբեք չի խոսում մասնավոր ցանցի հետ, այնուամենայնիվ ստեղծում է տվյալներ, որոնք մասնավոր ցանցը պետք է գնահատի։ Թունելը փոխում է միայն այն, թե ով ում է զանգում։ Ներբեռնումից հետո ամեն ինչ ներմուծման որոշում է և պատկանում է մասնավոր կողմին։ Այս շրջայցը հետևում է մեկ ներկայացման՝ դիտարկիչից մինչև հաստատված ներքին գրառում։

Սկսեք այնտեղ, որտեղ վայրէջք է կատարում ներկայացումը

Դիտարկիչը հրապարակում է հանրային վերջնակետում, որը տող է գրում վերահսկվող ընդունման պահոցում և ոչինչ ավելի չի վերադարձնում, քան հաստատում։ Այդ պահոցը հանձնման կետն է, և այն պետք է լինի միակը, որտեղ հանրային շերտը կարող է գրել։ Պահեք հում բեռն այնտեղ անփոփոխ՝ ժամանման ժամանակի և կայուն գրառման նույնացուցիչի հետ միասին։

Այնուհետև մասնավոր աշխատողը թունելով քաշում է սպասող տողերը և որոշում, թե ինչ անել յուրաքանչյուրի հետ։ Այն աշխատում է իր ինքնության ներքո, ինչն էլ հաջորդ բաժնի թեման է։

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-ի մուտքային տվյալների վավերացման ուղեցույցը հենց այդ պատճառով է backend հոսքերը համարում անվստահելի աղբյուրներ։ Գաղտնագրված փոխանցումը ասում է, որ բայթերը հասել են անվնաս, ոչ թե որ դրանք նկարագրում են թույլատրելի հարցում։ Վերլուծեք և վավերացրեք ցանկացած արտոնյալ քայլից առաջ, որպեսզի վատ տողը երբեք չհասնի գործել կարող կոդի ուղի։

Սահմանեք թույլատրված դաշտերը, դրանց ձևաչափերը, չափերը և այն գործարար կանոնները, որոնք պետք է պահպանվեն։ Ամսաթիվը կարող է ճիշտ ձևավորված լինել և այնուամենայնիվ սխալ լինել պահանջվող գործողության համար, և ներքին հաշիվ կամ հաստատման կարգավիճակ նշող բեռը չպետք է կարողանա իրեն տալ դրանցից ոչ մեկը։

Մերժված տողերը ուղարկեք վերանայման արդյունքի, փոխարենը ուղղում գուշակելու կամ դրանք shell կամ հում տվյալների բազայի ինտերֆեյս փոխանցելու։ Գրանցեք գրառման նույնացուցիչը և ձախողված կանոնը, ոչ թե դիմողի մուտքագրած յուրաքանչյուր դաշտ։

Կրկնափորձի կետ սարքեք մեկ գործողության վրա

Եթե 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

Առաջին երկու տողերը պետք է ավարտվեն տարբեր ներքին վիճակներում, իսկ երրորդը պետք է վերադարձնի այն նույնացուցիչը, որն արդեն հաստատված է այդ աղբյուր գրառման համար, փոխարենը երկրորդ ստեղծելու։ Ցանկացած այլ բան նշանակում է, որ ներմուծումը դեռ կրկնելի չէ։

Առնչվող հոդվածներ