Dalius Daro

2019 m. lapkričio 5 d., antradienis

„Pist!“ ir saugumas

Jei kas dar nežino neseniai paleidau „Pist!“ paslaugą skirtą atvirukų kūrimui ir siuntimui. Draugas pasisiūlė patikrinti puslapio saugumą. Aš, žinoma, sutikau - jau geriau tegu patikrina jis, nei koks nors man nežinomas asmuo ateityje .

Pastaba: jei neįdomu techninės detalės skaitykite paskutinį paragrafą.

Aš, žinoma tikėjausi, kad puslapis pakankamai saugus ir daugiausiai tikėjausi, kad draugui pavyks nebent:

  1. užkrauti serverį tiek, kad nebesugebės request’ų atsakinėti;

  2. prikurti fake duomenų, kuriuos man teks iš DB valyti;

  3. pasiuntinėti request’ų, kurie grąžins 500 klaidą;

Taigi, kai draugas pradėjo bandymus mano el. pašto dėžutė ėmė atrodyti taip:

pisthack1.jpg

Ši dalis man visai patiko. Tyliai imti ir laužyti puslapio iš esmės neįmanoma. Reiškia galėčiau imtis kažkokių aktyvių veiksmų norėdamas apsaugoti puslapį. Mano spėjimai daugiau mažiau buvo teisingi, nors buvo visai smagu matyti, kad serveris atsakinėjo į request’us net ir apkrautas beveik 100%. Aišku, po visko reikėjo išvalyti DB nuo šiukšlių. Na bet išvalyti porą lentelių nėra taip ir sunku.

Ko aš nesitikėjau, tai buvo šie dalykai:

pisthack1.jpg

pisthack2.jpg

Su komentaru „O, radau kaip nemokamai siųsti“.

Iš pradžių kilo minčių, kad buvo neteisingai įgyvendinta atviruko atšaukimo funkcija. „Pist!“ leidžia atšaukti apmokėtą atviruką, jei pastebėjote kažkokią klaidą. Atšaukę gausite nuolaidos kodą, kurį galėsite panaudoti. Deja, peržiūrėjus kodą ir patikrinus viską, problemos čia nebuvo rasta - atšaukti neapmokėto atviruko neįmanomą. Gerai.

Dar viena mintis buvo, kad blogai įgyvendinau apmokėjimus. Vėlgi čia problemos irgi nebuvo rasta - atsitiktinio apmokėjimo neįvyko. Apmokėjimų tiekėjas atrodo čia buvo visiškai ne prie ko.

Taip pat buvo pastebėta problema, kad galima pridėti atvirukus į užsakymą, po apmokėjimo inicijavimo. Tai buvo esminė problema, nes tai leido sukurti situaciją, kur užsakimo kaina minimali (pvz.: 2€), o atvirukų kiekis didelis. Vyšnaitė ant tortuko buvo ta, kad per skubėjimą palikau kodą, kuris leido apmokėjimą inicijuoti su nustatyta kaina (kas normalioje situacijoje nevyksta) ir ten buvo tokios kodo eilutės:

itemPrice = Math.trunc((amount * 100) / quantity);

Kur amount tarkime 2 (tarkime vietoje 1200), o quantity 600. itemPrice tokiu atveju tampa 0, o tai toliau kode reiškė, kad užsakymas tampa apmokėtu. Ką gi, kartais aš rašau prastą kodą irgi :see_no_evil: Tiesa sakant, turbūt dažniau negu norėčiau pripažinti sau. Šią problemą ir kitas susijusias problemas sutvarkiau ir blogą kodą išmečiau lauk.

Dar taip pat sugebėjau palikti serverio klaidų rodymą vartotojui. Dviejų eilučių pataisymas, bet daryti žioplas klaidas tikrai sugebu :hear_no_evil:

Buvo taip pat viena pastaba apie autentikaciją, bet autentikacija naudojama labai specifiniais atvejais ir ten galiu sau tai leisti.

Ir galų gale apibendrinimas. Ar komentaras „O, radau kaip nemokamai siųsti“ teisingas? Na jeigu per dieną žmonės užsakytų 5000 atvirukų, tai galbūt būtų tiesa. Bet šiaip užsakymas su virš 100 atvirukų tiesiog atrodytų labai įtartinas, kai tikriausiai negavau jokio apmokėjimo atitinkančio tokį ir paprasčiausiai jo nevykdyčiau. Prie vartotojų duomenų priėjimo gauti nepavyko - tai yra gerai. Tai, iš esmės, nuskriaustas galėjau likti nebent aš.