Ez a cikk az első a bejegyzések sorában, amelyek az elmúlt 8 év különböző SaaS-termékeinek és webhelyeinek futtatásáról írok. Megosztok néhány problémát, amivel megküzdöttem, a leckéket, amelyeket megtanultam, az elkövetett hibákat, és talán néhány dolgot, ami jól sikerült. Hadd tudja mit gondolsz!
Még 2019-ben vagy 2020-ban úgy döntöttem, hogy átírom a teljes háttérprogramot Feladó letiltása, egy SaaS-alkalmazás, amely többek között segít a felhasználóknak jobb e-mail blokkok létrehozásában. A folyamat során hozzáadtam néhány új funkciót, és frissítettem sokkal modernebb technológiákra. Lefuttattam a teszteket, telepítettem a kódot, manuálisan teszteltem mindent a termelésben, és néhány véletlenszerű esélyt leszámítva minden remekül működött. Bárcsak itt lenne a történet vége, de…
Néhány héttel később értesítést kaptam egy ügyfelemtől (ami önmagában kínos), hogy a szolgáltatás nem működik, és rengeteg blokkolandó e-mail érkezik a postaládájába, ezért kivizsgáltam. Ez a probléma sokszor abból adódik, hogy a Google megszakította a kapcsolatot a szolgáltatásunkból a felhasználó fiókjával, amit a rendszer úgy kezel, hogy e-mailben értesíti a felhasználót, és kéri, hogy csatlakozzanak újra, ezúttal azonban másról volt szó.
Úgy tűnt, hogy az e-maileket ellenőrző háttérmunkás 5-10 percenként összeomlott. A legfurcsább rész – nem volt hiba a naplókban, a memória rendben volt, de a CPU időnként megugrik látszólag véletlenszerű időpontokban. Így a következő 24 órában (3 órás alvási szünettel – elnézést az ügyfelektől 😬) manuálisan kellett újraindítanom a dolgozót minden alkalommal, amikor összeomlott. Valamilyen oknál fogva az Elastic Beanstalk szolgáltatás túl sokáig várt az újraindításra, ezért manuálisan kellett megtennem.
A termelési problémák hibakeresése mindig fájdalmas, különösen azért, mert nem tudtam helyben reprodukálni a problémát, nem is beszélve arról, hogy kiderítsem, mi okozta. Szóval, mint minden „jó” fejlesztő, most kezdtem el a naplózást minden és megvárta, amíg a szerver újra összeomlik. Mivel a CPU időnként felugrik, úgy gondoltam, hogy ez nem makróprobléma (például amikor elfogy a memória), és valószínűleg egy adott e-mail vagy felhasználó okozta. Szóval megpróbáltam leszűkíteni:
- Egy bizonyos e-mail azonosítónál vagy típusnál összeomlott?
- Egy adott ügyfélnél összeomlott?
- Rendszeres időközönként összeomlott?
Órák után, és hosszabb ideig bámultam a naplókat, mint amennyit szerettem volna, végül leszűkítettem egy konkrét ügyfélre. Innentől kezdve a keresési terület meglehetősen szűkült – ez valószínűleg egy blokkoló szabály vagy egy adott e-mail volt, amelyet a szerverünk folyamatosan újrapróbált. Szerencsémre az előbbi volt, ami sokkal egyszerűbb hibakeresési probléma, mivel mi egy nagyon az adatvédelemre összpontosító vállalat vagyunk, és nem tárolunk és nem tekintünk meg semmilyen e-mail adatot.
Mielőtt rátérnénk a pontos problémára, először beszéljünk a Block Sender egyik funkciójáról. Akkoriban sok ügyfelem kért helyettesítő karakterek blokkolását, ami lehetővé tette számukra, hogy blokkoljanak bizonyos típusú e-mail-címeket, amelyek ugyanazt a mintát követték. Ha például blokkolni szeretné a marketing e-mail-címekről érkező összes e-mailt, használhatja a helyettesítő karaktert marketing@*
és blokkolná az összes olyan e-mailt, amelyik ezzel kezdődik marketing@
.
Egy dologra nem gondoltam, hogy nem mindenki érti a helyettesítő karakterek működését. Feltételeztem, hogy a legtöbb ember ugyanúgy fogja használni őket, mint én fejlesztőként, egyet használva *
tetszőleges számú karakter ábrázolására. Sajnos ez a felhasználó azt feltételezte, hogy használnia kell egy helyettesítő karakter minden egyes megjelölni kívánt karakterhez. Az ő esetükben egy bizonyos domainről akarták letiltani az összes e-mailt (ami a Block Sender natív funkciója, de biztos nem vették észre, ami már önmagában is probléma). Tehát használat helyett *@example.com
, használták **********@example.com
.
POV: Figyeli, hogy a felhasználók használják az alkalmazásodat…
A helyettesítő karakterek kezelésére a dolgozói szerverünkön a Node.js könyvtárat használjuk matcher, amely reguláris kifejezéssé alakításával segíti a glob-illesztést. Ez a könyvtár akkor fordulna **********@example.com
valami olyasmibe, mint a következő regex:
/[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*@example.com/i
Ha van tapasztalata a regex-el kapcsolatban, tudja, hogy ezek nagyon gyorsan bonyolulttá válhatnak, különösen számítási szinten. A fenti kifejezés tetszőleges ésszerű hosszúságú szöveghez való illesztése számítási szempontból nagyon költségessé válik, ami a munkaszerverünk CPU-ját lekötötte. Ez az oka annak, hogy a szerver néhány percenként összeomlik; elakadna egy összetett reguláris kifejezés és egy e-mail cím párosítása. Tehát minden alkalommal, amikor ez a felhasználó e-mailt kapott, az ideiglenes hibák kezelésére beépített összes próbálkozáson kívül a szerver összeomlását okozta.
Szóval hogyan javítottam ki? Nyilvánvalóan a gyors megoldás az volt, hogy egymás után meg kell keresni az összes blokkot több helyettesítő karakterrel, és kijavítani őket. De jobb munkát kellett végeznem a felhasználói bevitel fertőtlenítésére is. Bármely felhasználó beírhat egy reguláris kifejezést, és leveheti az egész rendszert a ReDoS támadás.
Tekintse meg gyakorlatias, gyakorlati útmutatónkat a Git tanulásához, amely tartalmazza a bevált gyakorlatokat, az iparág által elfogadott szabványokat és a mellékelt csalólapot. Hagyd abba a guglizást a Git parancsokkal, és valójában tanulni meg!
Ennek a konkrét esetnek a kezelése meglehetősen egyszerű volt – távolítsa el az egymást követő helyettesítő karaktereket:
block = block.replace(/*+/g, '*')
Ez azonban továbbra is nyitva hagyja az alkalmazást más típusú ReDoS támadások előtt. Szerencsére számos csomag/könyvtár segít nekünk ezekkel a típusokkal is:
A fenti megoldások és egyéb biztosítékok kombinációjával sikerült megakadályoznom, hogy ez még egyszer megtörténjen. De jó emlékeztető volt arra, hogy soha nem bízhatsz a felhasználói bevitelben, és mindig meg kell tisztítanod, mielőtt az alkalmazásban használnád. Nem is tudtam, hogy ez egy lehetséges probléma, amíg meg nem történt velem, így remélhetőleg ez segít valaki másnak elkerülni ugyanazt a problémát.
Van kérdése, megjegyzése, vagy szeretné megosztani a saját történetét? Nyújtsa ki a kezét Twitter!
- SEO által támogatott tartalom és PR terjesztés. Erősödjön még ma.
- PlatoData.Network Vertical Generative Ai. Erősítse meg magát. Hozzáférés itt.
- PlatoAiStream. Web3 Intelligence. Felerősített tudás. Hozzáférés itt.
- PlatoESG. Carbon, CleanTech, Energia, Környezet, Nap, Hulladékgazdálkodás. Hozzáférés itt.
- PlatoHealth. Biotechnológiai és klinikai vizsgálatok intelligencia. Hozzáférés itt.
- Forrás: https://stackabuse.com/behind-the-scenes-never-trust-user-input/
- :van
- :is
- :nem
- $ UP
- 1
- 20
- 2019
- 2020
- 24
- 8
- a
- Képes
- Rólunk
- felett
- Fiók
- tulajdonképpen
- hozzáadott
- mellett
- cím
- címek
- újra
- ellen
- Minden termék
- lehetővé
- kizárólag
- Is
- mindig
- között
- an
- és a
- bármilyen
- app
- Alkalmazás
- VANNAK
- cikkben
- AS
- kér
- feltételezte
- At
- Támadások
- elkerülése érdekében
- tudatában van
- háttér
- BE
- Beanstalk
- válik
- óta
- előtt
- mögött
- a színfalak mögött
- hogy
- Jobb
- Bit
- Blokk
- blokkoló
- Blocks
- határ
- szünet
- épült
- de
- by
- TUD
- Kaphat
- ami
- eset
- okozott
- okozó
- bizonyos
- karakter
- karakter
- ellenőrzése
- kód
- kombináció
- Hozzászólások
- vállalat
- bonyolult
- bonyolult
- számítási
- kapcsolat
- kijavítására
- tudott
- nem tudott
- Crash
- Crashed
- Összeomlik
- teremt
- vevő
- Ügyfelek
- dátum
- foglalkozott
- határozott
- telepített
- Fejlesztő
- DID
- nem
- do
- domain
- Don
- le-
- két
- minden
- könnyebb
- más
- e-mailek
- végén
- véget ért
- vége
- belép
- Egész
- hibák
- különösen
- Még
- végül is
- Minden
- mindenki
- minden
- példa
- drága
- tapasztalat
- kifejezés
- hibák
- meglehetősen
- messze
- Funkció
- Jellemzők
- kevés
- Ábra
- mintás
- Találjon
- végén
- vezetéknév
- Rögzít
- Összpontosít
- követ
- következő
- A
- Korábbi
- ból ből
- kap
- szerzés
- gif
- megy
- adott
- jó
- nagy
- útmutató
- kellett
- fogantyú
- Fogantyúk
- hands-on
- történt
- Esemény
- Legyen
- segít
- segít
- remélhetőleg
- NYITVATARTÁS
- lebeg
- Hogyan
- HTTPS
- i
- ID
- if
- in
- beleértve
- bemenet
- helyette
- bele
- kérdés
- kérdések
- IT
- maga
- Munka
- éppen
- tartotta
- Ismer
- keresztnév
- a későbbiekben
- tanult
- tanulás
- Hossz
- Tanulságok
- hadd
- szint
- LG
- könyvtár
- mint
- Valószínű
- ll
- helyileg
- fakitermelés
- Hosszú
- hosszabb
- nézett
- sok
- Macro
- készült
- kézzel
- sok
- Marketing
- Mérkőzés
- egyező
- talán
- me
- Memory design
- Perc
- hibákat
- modern
- modern technológiák
- több
- a legtöbb
- sok
- többszörös
- kell
- keskeny
- bennszülött
- szükséges
- soha
- Új
- Új funkciók
- következő
- nem
- csomópont
- node.js
- értesítve
- szám
- Esély
- of
- on
- ONE
- nyitva
- or
- Más
- mi
- ki
- saját
- Fájdalom
- rész
- különös
- Mintás
- Emberek (People)
- Plató
- Platón adatintelligencia
- PlatoData
- Hozzászólások
- potenciális
- Gyakorlati
- megakadályozása
- valószínűleg
- Probléma
- folyamat
- Termelés
- Termékek
- Kérdések
- Quick
- gyorsan
- egészen
- véletlen
- RE
- el
- realizált
- ok
- ésszerű
- kapott
- dugja
- regex
- szabályos
- emlékeztető
- eltávolítása
- eltávolítása
- képvisel
- jobb
- Gyűrű
- Szabály
- futás
- futás
- s
- SaaS
- biztosítékok
- azonos
- jelenetek
- Keresés
- Úgy tűnt
- látszólag
- feladó
- Series of
- szerver
- szolgáltatás
- árnyék
- Megosztás
- megosztás
- adatlap
- kellene
- Egyszerű
- óta
- alvás
- So
- Megoldások
- néhány
- Valaki
- valami
- Hely
- különleges
- tüske
- Stackabus
- szabványok
- kezdődött
- Még mindig
- megáll
- tárolni
- Történet
- rendszer
- Vesz
- Beszél
- Technologies
- ideiglenes
- kipróbált
- tesztek
- szöveg
- mint
- hogy
- A
- azok
- Őket
- akkor
- Ott.
- Ezek
- ők
- dolog
- dolgok
- Szerintem
- ezt
- idő
- alkalommal
- nak nek
- is
- átmenet
- kipróbált
- Bízzon
- próbál
- FORDULAT
- Turning
- típus
- típusok
- megérti
- sajnálatos módon
- -ig
- frissített
- us
- használ
- használt
- használó
- Felhasználók
- segítségével
- különféle
- Ve
- nagyon
- keresztül
- Megnézem
- Várakozás
- akar
- kívánatos
- volt
- nem volt
- őrzés
- Út..
- we
- honlapok
- Hetek
- JÓL
- ment
- voltak
- Mit
- amikor
- ami
- egész
- miért
- Wikipedia
- kíván
- val vel
- Munka
- munkás
- dolgozó
- lenne
- írás
- év
- te
- A te
- zephyrnet