Acest articol este primul dintr-o serie de postări pe care le scriu despre rularea diferitelor produse și site-uri web SaaS în ultimii 8 ani. Voi împărtăși unele dintre problemele cu care m-am ocupat, lecțiile pe care le-am învățat, greșelile pe care le-am făcut și poate câteva lucruri care au mers bine. Lasă-mă să știu ce credeţi!
În 2019 sau 2020, am decis să rescriu întregul backend pentru Blochează expeditorul, o aplicație SaaS care ajută utilizatorii să creeze blocuri de e-mail mai bune, printre alte caracteristici. În acest proces, am adăugat câteva funcții noi și am făcut upgrade la tehnologii mult mai moderne. Am rulat testele, am implementat codul, am testat manual totul în producție și, în afară de câteva șanse aleatorii, totul părea să funcționeze grozav. Mi-aș fi dorit ca acesta să fie sfârșitul poveștii, dar...
Câteva săptămâni mai târziu, am fost înștiințat de un client (ceea ce este jenant în sine) că serviciul nu funcționa și că primesc o mulțime de e-mailuri care ar trebui să fie blocate în căsuța de e-mail, așa că am investigat. De multe ori, această problemă se datorează faptului că Google a eliminat conexiunea din serviciul nostru la contul utilizatorului, pe care sistemul o gestionează notificând utilizatorul prin e-mail și cerându-i să se reconecteze, dar de data aceasta a fost altceva.
S-a părut că lucrătorul backend care se ocupă de verificarea e-mailurilor față de blocurile de utilizatori continua să se blocheze la fiecare 5-10 minute. Cea mai ciudată parte – nu au existat erori în jurnale, memoria era bună, dar CPU-ul avea să crească ocazional în momente aparent aleatorii. Așa că în următoarele 24 de ore (cu o pauză de 3 ore pentru a dormi – scuze clienții 😬), a trebuit să repornesc manual lucrătorul de fiecare dată când s-a prăbușit. Din anumite motive, serviciul Elastic Beanstalk a așteptat mult prea mult să repornească, motiv pentru care a trebuit să o fac manual.
Depanarea problemelor în producție este întotdeauna o durere, mai ales că nu am putut reproduce problema la nivel local, cu atât mai puțin să îmi dau seama ce a cauzat-o. Deci, ca orice dezvoltator „bun”, tocmai am început să mă înregistrez tot și a așteptat ca serverul să se blocheze din nou. Deoarece CPU-ul creștea periodic, m-am gândit că nu era o problemă macro (cum ar fi atunci când rămâneți fără memorie) și probabil că era cauzată de un anumit e-mail sau utilizator. Așa că am încercat să o restrâng:
- S-a blocat pe un anumit ID sau tip de e-mail?
- S-a prăbușit pentru un anumit client?
- S-a prăbușit la un interval regulat?
După ore întregi de asta, și m-am uitat la bușteni mai mult decât mi-ar plăcea, în cele din urmă, am restrâns-o la un anumit client. De acolo, spațiul de căutare s-a restrâns destul de mult – cel mai probabil a fost o regulă de blocare sau un e-mail specific pe care serverul nostru a continuat să reîncerce. Din fericire pentru mine, a fost primul, care este o problemă mult mai ușor de depanat, având în vedere că suntem o companie foarte concentrată asupra confidențialității și nu stocăm și nu vizualizăm date de e-mail.
Înainte de a intra în problema exactă, să vorbim mai întâi despre una dintre funcțiile Block Sender. La acea vreme aveam mulți clienți care cereau blocarea cu wildcard, ceea ce le-ar permite să blocheze anumite tipuri de adrese de e-mail care urmau același model. De exemplu, dacă doriți să blocați toate e-mailurile de la adresele de e-mail de marketing, puteți utiliza caracterul metalic marketing@*
și ar bloca toate e-mailurile de la orice adresă care a început cu marketing@
.
Un lucru la care nu m-am gândit este că nu toată lumea înțelege cum funcționează metacaracterele. Am presupus că majoritatea oamenilor le vor folosi în același mod în care fac eu ca dezvoltator, folosind unul *
pentru a reprezenta orice număr de caractere. Din păcate, acest utilizator anume a presupus că trebuie să utilizați un wildcard pentru fiecare personaj pe care ați vrut să-l potriviți. În cazul lor, au vrut să blocheze toate e-mailurile dintr-un anumit domeniu (care este o caracteristică nativă pe care o are Block Sender, dar nu și-au dat seama, ceea ce este o problemă în sine). Deci, în loc să folosiți *@example.com
, ei au folosit **********@example.com
.
POV: Vizionarea utilizatorilor dvs. folosind aplicația dvs....
Pentru a gestiona metacaracterele pe serverul nostru de lucru, folosim biblioteca Node.js potrivitor, care ajută la potrivirea globului transformându-l într-o expresie regulată. Această bibliotecă s-ar întoarce atunci **********@example.com
în ceva de genul următor regex:
/[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*@example.com/i
Dacă aveți experiență cu regex, știți că acestea se pot complica foarte repede, mai ales la nivel de calcul. Potrivirea expresiei de mai sus cu orice lungime rezonabilă a textului devine foarte costisitoare din punct de vedere computațional, ceea ce a ajuns să blocheze CPU pe serverul nostru de lucru. Acesta este motivul pentru care serverul se bloca la fiecare câteva minute; ar rămâne blocat încercând să potriviți o expresie regulată complexă cu o adresă de e-mail. Deci, de fiecare dată când acest utilizator a primit un e-mail, pe lângă toate încercările pe care le-am încorporat pentru a gestiona eșecurile temporare, serverul nostru se bloca.
Deci cum am rezolvat asta? Evident, soluția rapidă a fost să găsești toate blocurile cu mai multe wildcarduri succesive și să le corectezi. Dar trebuia și să fac o treabă mai bună de dezinfectare a intrărilor utilizatorului. Orice utilizator ar putea introduce o expresie regex și poate elimina întregul sistem cu un Atacul ReDoS.
Consultați ghidul nostru practic și practic pentru a învăța Git, cu cele mai bune practici, standarde acceptate de industrie și fisa de cheat incluse. Opriți căutarea pe Google a comenzilor Git și de fapt învăţa aceasta!
Gestionarea acestui caz particular a fost destul de simplă – eliminați caracterele joker succesive:
block = block.replace(/*+/g, '*')
Dar asta încă lasă aplicația deschisă altor tipuri de atacuri ReDoS. Din fericire, există o serie de pachete/biblioteci care ne ajută și cu aceste tipuri:
Folosind o combinație a soluțiilor de mai sus și a altor măsuri de siguranță, am reușit să împiedic ca acest lucru să se repete. Dar a fost un bun memento că nu poți niciodată să ai încredere în intrarea utilizatorului și ar trebui să o igienizezi întotdeauna înainte de a o folosi în aplicația ta. Nici măcar nu am fost conștient că aceasta este o problemă potențială până nu mi s-a întâmplat, așa că sper că asta ajută pe altcineva să evite aceeași problemă.
Aveți întrebări, comentarii sau doriți să împărtășiți o poveste proprie? Întinde mâna Twitter!
- Distribuție de conținut bazat pe SEO și PR. Amplifică-te astăzi.
- PlatoData.Network Vertical Generative Ai. Împuterniciți-vă. Accesați Aici.
- PlatoAiStream. Web3 Intelligence. Cunoștințe amplificate. Accesați Aici.
- PlatoESG. carbon, CleanTech, Energie, Mediu inconjurator, Solar, Managementul deșeurilor. Accesați Aici.
- PlatoHealth. Biotehnologie și Inteligență pentru studii clinice. Accesați Aici.
- Sursa: https://stackabuse.com/behind-the-scenes-never-trust-user-input/
- :are
- :este
- :nu
- $UP
- 1
- 20
- 2019
- 2020
- 24
- 8
- a
- Capabil
- Despre Noi
- mai sus
- Cont
- de fapt
- adăugat
- plus
- adresa
- adrese
- din nou
- împotriva
- TOATE
- permite
- singur
- de asemenea
- mereu
- printre
- an
- și
- Orice
- aplicaţia
- aplicație
- SUNT
- articol
- AS
- solicitând
- asumat
- At
- Atacuri
- evita
- conştient
- Backend
- BE
- vrejul de fasole
- devine
- fost
- înainte
- în spatele
- în spatele scenelor
- fiind
- Mai bine
- Pic
- Bloca
- blocarea
- Blocuri
- frontieră
- Pauză
- construit
- dar
- by
- CAN
- Poate obține
- pasă
- caz
- cauzată
- provocând
- sigur
- caracter
- caractere
- control
- cod
- combinaţie
- comentarii
- companie
- complex
- complicat
- de calcul
- conexiune
- corecta
- ar putea
- putea
- Crash
- prăbuşit
- crashing
- crea
- client
- clienţii care
- de date
- tratate
- hotărât
- dislocate
- Dezvoltator
- FĂCUT
- nu
- do
- domeniu
- don
- jos
- două
- fiecare
- mai ușor
- altfel
- e-mailuri
- capăt
- încheiat
- se încheie
- Intrați
- Întreg
- Erori
- mai ales
- Chiar
- în cele din urmă
- Fiecare
- toată lumea
- tot
- exemplu
- scump
- experienţă
- expresie
- eşecuri
- destul de
- departe
- Caracteristică
- DESCRIERE
- puțini
- Figura
- imaginat
- Găsi
- capăt
- First
- Repara
- Concentra
- a urmat
- următor
- Pentru
- Fost
- din
- obține
- obtinerea
- gif
- merge
- dat
- bine
- mare
- ghida
- HAD
- manipula
- Mânere
- hands-on
- sa întâmplat
- lucru
- Avea
- ajutor
- ajută
- In speranta
- ORE
- planare
- Cum
- HTTPS
- i
- ID
- if
- in
- inclus
- intrare
- in schimb
- în
- problema
- probleme de
- IT
- în sine
- Loc de munca
- doar
- ținut
- Cunoaște
- Nume
- mai tarziu
- învățat
- învăţare
- Lungime
- Lectii
- lăsa
- Nivel
- LG
- Bibliotecă
- ca
- Probabil
- ll
- la nivel local
- logare
- Lung
- mai lung
- uitat
- loturi
- Macro
- făcut
- manual
- multe
- Marketing
- Meci
- potrivire
- poate
- me
- Memorie
- minute
- greşeli
- Modern
- tehnologii moderne
- mai mult
- cele mai multe
- mult
- multiplu
- trebuie sa
- îngust
- nativ
- necesar
- nu
- Nou
- Funcții noi
- următor
- Nu.
- nod
- Node.js
- sesizând
- număr
- Cote
- of
- on
- ONE
- deschide
- or
- Altele
- al nostru
- afară
- propriu
- Durere
- parte
- special
- Model
- oameni
- Plato
- Informații despre date Platon
- PlatoData
- postări
- potenţial
- Practic
- împiedica
- probabil
- Problemă
- proces
- producere
- Produse
- Întrebări
- Rapid
- repede
- cu totul
- aleator
- RE
- ajunge
- realizat
- motiv
- rezonabil
- primit
- reconectarea
- regex
- regulat
- aducere aminte
- scoate
- eliminarea
- reprezenta
- dreapta
- Inel
- Regula
- Alerga
- funcţionare
- s
- SaaS
- garanții
- acelaşi
- scene
- Caută
- părea
- aparent
- expeditor
- serie
- serverul
- serviciu
- Umbră
- Distribuie
- partajarea
- coală
- să
- simplu
- întrucât
- dormi
- So
- soluţii
- unele
- Cineva
- ceva
- Spaţiu
- specific
- cui
- Stackabuse
- standarde
- început
- Încă
- Stop
- stoca
- Poveste
- sistem
- Lua
- Vorbi
- Tehnologii
- temporar
- testat
- teste
- a) Sport and Nutrition Awareness Day in Manasia Around XNUMX people from the rural commune Manasia have participated in a sports and healthy nutrition oriented activity in one of the community’s sports ready yards. This activity was meant to gather, mainly, middle-aged people from a Romanian rural community and teach them about the benefits that sports have on both their mental and physical health and on how sporting activities can be used to bring people from a community closer together. Three trainers were made available for this event, so that the participants would get the best possible experience physically and so that they could have the best access possible to correct information and good sports/nutrition practices. b) Sports Awareness Day in Poiana Țapului A group of young participants have taken part in sporting activities meant to teach them about sporting conduct, fairplay, and safe physical activities. The day culminated with a football match.
- decât
- acea
- lor
- Lor
- apoi
- Acolo.
- Acestea
- ei
- lucru
- lucruri
- crede
- acest
- timp
- ori
- la
- de asemenea
- tranziţie
- încercat
- Încredere
- încercat
- ÎNTORCĂ
- Cotitură
- tip
- Tipuri
- înțelege
- din pacate
- până la
- modernizate
- us
- utilizare
- utilizat
- Utilizator
- utilizatorii
- folosind
- diverse
- Ve
- foarte
- de
- Vizualizare
- Aşteptare
- vrea
- dorit
- a fost
- nu a fost
- vizionarea
- Cale..
- we
- site-uri web
- săptămâni
- BINE
- a mers
- au fost
- Ce
- cand
- care
- întreg
- de ce
- Wikipedia
- dori
- cu
- Apartamente
- lucrător
- de lucru
- ar
- scris
- ani
- Tu
- Ta
- zephyrnet