Tema
/
Interneto svetainių serverio dalies kūrimas GO
📖 Teorija

Namų darbas — įrodyk plokščią srautą, užkabink ribą

Augina programą. Pridėk įkėlimą į savo programą, jei jos sritis turi failų — kitaip daryk tai su SignFlow.

  1. Įrodyk, kad srautas plokščias. Sukurk didelį failą — head -c 20000000 /dev/urandom > big.bin (20 MB). Įkelk jį stebėdamas atmintį (top, arba Go runtime.ReadMemStats, užrašytą prieš ir po). Rezidentinis dydis nepašoka 20 MB — nes io.MultiWriter niekada nelaiko failo, jis srautu teka. Dabar įsivaizduok naivią io.ReadAll versiją ir ką dešimt lygiagrečių įkėlimų jai padarytų.

  2. Užkabink ribą. Įkelk failą kiek virš 25 MiB (head -c 27000000 /dev/urandom > toobig.bin). Patvirtink, kad atsakymas yra 413, uploads/ nieko negavo, o documents lentelė nepakitusi. Tada perskaityk http.MaxBytesReader dokumentaciją: ką ji daro, pasiekus ribą, ir kodėl tai teisingas elgesys serveriui?

  3. Atakuok raktą (popieriuje). safePath atmeta bet kokį raktą, kuris nėra 32 šešioliktainiai ženklai. Tarkim, pašalinai tą patikrą ir užpuolikas gali nustatyti storage_key į ../../main.go. Atsek, ką tuomet nuskaitytų Open. Parašyk vieną sakinį, kodėl tikrinti raktą — ne failo vardą — yra teisinga apsaugos vieta.

  4. Patikrink vientisumą ranka. Paimk įkeltą failą ir paleisk sha256sum originalui. Palygink su file_hash stulpeliu — jie sutampa. Pakeisk vieną originalo baitą, sumaišyk vėl: visiškai kitokia. Būtent ta savybė, kuria vėliau rems parašas, todėl maišą verta saugoti įkėlimo metu.

Kita pamoka paverčia šį sąrašą tikru paviršiumi: dokumento peržiūra, atsisiuntimas ir juodraščio trynimas — su autorizacija, užtikrinta pačioje SQL, ne if sakiniu po nuskaitymo.