Tämä artikkeli on ensimmäinen artikkelisarjassa, jonka kirjoitan useiden SaaS-tuotteiden ja -sivustojen käyttämisestä viimeisen 8 vuoden aikana. Kerron joistakin käsittelemistäni ongelmista, oppimistani asioista, tekemistäni virheistä ja ehkä joistakin asioista, jotka menivät oikein. Haluaisin tietää mitä sinä ajattelet!
Vuonna 2019 tai 2020 olin päättänyt kirjoittaa koko taustaohjelman uudelleen Estä lähettäjä, SaaS-sovellus, joka auttaa käyttäjiä luomaan parempia sähköpostilohkoja muun muassa. Samalla lisäsin muutamia uusia ominaisuuksia ja päivitin paljon nykyaikaisempaan tekniikkaan. Suoritin testit, otin koodin käyttöön, testasin manuaalisesti kaikkea tuotannossa, ja muutamaa satunnaista kerrointa lukuun ottamatta kaikki näytti toimivan hyvin. Toivon, että tämä olisi tarinan loppu, mutta…
Muutamaa viikkoa myöhemmin eräs asiakas ilmoitti minulle (mikä on sinänsä noloa), että palvelu ei toiminut ja he saivat postilaatikkoonsa paljon sähköposteja, jotka olisi estettävä, joten tutkin asiaa. Usein tämä ongelma johtuu siitä, että Google on poistanut yhteyden palvelustamme käyttäjän tiliin, minkä järjestelmä hoitaa ilmoittamalla käyttäjälle sähköpostitse ja pyytämällä yhteyden uudelleen, mutta tällä kertaa kyse oli jostain muusta.
Näytti siltä, että taustatyöntekijä, joka tarkistaa sähköpostit käyttäjien estojen varalta, kaatui 5–10 minuutin välein. Kummallisin osa - lokeissa ei ollut virheitä, muisti oli kunnossa, mutta prosessori piikitti toisinaan näennäisesti satunnaisina aikoina. Joten seuraavan 24 tunnin ajan (3 tunnin nukkumistauolla – pahoittelut asiakkaat 😬) jouduin käynnistämään työntekijän manuaalisesti uudelleen aina kun se kaatui. Jostain syystä Elastic Beanstalk -palvelu odotti aivan liian kauan uudelleenkäynnistystä, minkä vuoksi minun piti tehdä se manuaalisesti.
Tuotannon virheenkorjaus on aina tuskaa, varsinkin kun en pystynyt toistamaan ongelmaa paikallisesti, saati sitten selvittää, mikä sen aiheutti. Joten kuten mikä tahansa "hyvä" kehittäjä, aloin juuri kirjaamisen kaikki ja odotti palvelimen kaatumista uudelleen. Koska prosessori nousi ajoittain, ajattelin, että se ei ollut makro-ongelma (kuten muistin loppuessa), vaan se johtuu todennäköisesti tietystä sähköpostista tai käyttäjästä. Joten yritin rajata sitä:
- Kaatuiko se tiettyyn sähköpostiosoitteeseen tai tyyppiin?
- Kaatuiko se tietylle asiakkaalle?
- Kaatuiko se säännöllisin väliajoin?
Tuntien tämän jälkeen ja tuijottaessani tukkeja pidempään kuin haluaisin, lopulta rajasin sen tiettyyn asiakkaaseen. Sieltä hakutila kaventui melkoisesti – se oli todennäköisesti estosääntö tai tietty sähköposti, jota palvelimemme yritti jatkuvasti uudelleen. Onneksi se oli edellinen, jonka virheenkorjaus on paljon helpompi ongelma, koska olemme erittäin yksityisyyteen keskittyvä yritys emmekä tallenna tai katsele sähköpostitietoja.
Ennen kuin pääsemme tarkalleen ongelmaan, puhutaan ensin yhdestä Block Senderin ominaisuuksista. Tuolloin minulla oli monia asiakkaita, jotka pyysivät jokerimerkkien estoa, mikä antaisi heille mahdollisuuden estää tietyntyyppiset sähköpostiosoitteet, jotka noudattavat samaa kaavaa. Jos esimerkiksi haluat estää kaikki sähköpostit markkinointisähköpostiosoitteista, voit käyttää jokerimerkkiä marketing@*
ja se estäisi kaikki sähköpostit mistä tahansa osoitteesta, joka alkoi marketing@
.
Yksi asia, jota en ajatellut, on se, että kaikki eivät ymmärrä, kuinka yleismerkit toimivat. Oletin, että useimmat ihmiset käyttäisivät niitä samalla tavalla kuin minä kehittäjänä, käyttämällä yhtä *
edustaa minkä tahansa määrän merkkejä. Valitettavasti tämä tietty käyttäjä oli olettanut, että sinun oli käytettävä yksi jokerimerkki jokaiselle hahmolle, jota haluat yhdistää. Heidän tapauksessaan he halusivat estää kaikki sähköpostit tietystä verkkotunnuksesta (joka on Block Senderin alkuperäinen ominaisuus, mutta he eivät välttämättä tajunneet sitä, mikä on kokonainen ongelma sinänsä). Joten käytön sijaan *@example.com
, he käyttivät **********@example.com
.
POV: Katsotaan käyttäjiäsi käyttävän sovellustasi…
Käytämme Node.js-kirjastoa käsitelläksemme yleismerkkejä työpalvelimellamme haussa, joka auttaa maapallon täsmäämisessä muuttamalla sen säännölliseksi lausekkeeksi. Tämä kirjasto kääntyisi sitten **********@example.com
johonkin seuraavan regexin kaltaiseen:
/[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*@example.com/i
Jos sinulla on kokemusta säännöllisistä lausekkeista, tiedät, että ne voivat muuttua erittäin nopeasti monimutkaisiksi, etenkin laskennallisella tasolla. Yllä olevan lausekkeen sovittaminen mihin tahansa kohtuulliseen tekstin pituuteen tulee laskennallisesti erittäin kalliiksi, mikä johti työpalvelimemme CPU:n sitomiseen. Tästä syystä palvelin kaatuu muutaman minuutin välein; se juuttuisi yritettäessä sovittaa monimutkainen säännöllinen lauseke sähköpostiosoitteeseen. Joten joka kerta kun tämä käyttäjä sai sähköpostin, kaikkien tilapäisten vikojen käsittelyyn sisältyneiden uudelleenyritysten lisäksi se kaatui palvelimemme.
Joten miten korjasin tämän? Ilmeisesti nopea ratkaisu oli löytää kaikki lohkot, joissa oli useita yleismerkkejä peräkkäin, ja korjata ne. Mutta minun piti myös tehdä parempaa työtä käyttäjän syötteiden puhdistamisessa. Kuka tahansa käyttäjä voi syöttää säännöllisen lausekkeen ja poistaa koko järjestelmän a.:lla ReDoS-hyökkäys.
Tutustu käytännönläheiseen, käytännölliseen Gitin oppimisoppaaseemme, jossa on parhaat käytännöt, alan hyväksymät standardit ja mukana tuleva huijauslehti. Lopeta Git-komentojen googlailu ja oikeastaan oppia se!
Tämän tapauksen käsitteleminen oli melko yksinkertaista – poista peräkkäiset jokerimerkit:
block = block.replace(/*+/g, '*')
Mutta tämä jättää sovelluksen avoimeksi muun tyyppisille ReDoS-hyökkäyksille. Onneksi on olemassa useita paketteja/kirjastoja, jotka auttavat meitä myös näiden tyyppien kanssa:
Yllä olevien ratkaisujen ja muiden suojatoimien yhdistelmällä olen pystynyt estämään tämän toistumisen. Mutta se oli hyvä muistutus siitä, että et voi koskaan luottaa käyttäjän syötteeseen, ja sinun tulee aina puhdistaa se ennen kuin käytät sitä sovelluksessasi. En edes tiennyt tämän olevan mahdollinen ongelma ennen kuin se tapahtui minulle, joten toivottavasti tämä auttaa jotakuta muuta välttämään saman ongelman.
Onko sinulla kysyttävää, kommentteja tai haluatko jakaa oman tarinasi? Ota yhteyttä Twitter!
- SEO-pohjainen sisällön ja PR-jakelu. Vahvista jo tänään.
- PlatoData.Network Vertical Generatiivinen Ai. Vahvista itseäsi. Pääsy tästä.
- PlatoAiStream. Web3 Intelligence. Tietoa laajennettu. Pääsy tästä.
- PlatoESG. hiili, CleanTech, energia, ympäristö, Aurinko, Jätehuolto. Pääsy tästä.
- PlatonHealth. Biotekniikan ja kliinisten kokeiden älykkyys. Pääsy tästä.
- Lähde: https://stackabuse.com/behind-the-scenes-never-trust-user-input/
- :on
- :On
- :ei
- $ YLÖS
- 1
- 20
- 2019
- 2020
- 24
- 8
- a
- pystyy
- Meistä
- edellä
- Tili
- todella
- lisä-
- Lisäksi
- osoite
- osoitteet
- uudelleen
- vastaan
- Kaikki
- sallia
- yksin
- Myös
- aina
- keskuudessa
- an
- ja
- Kaikki
- sovelluksen
- Hakemus
- OVAT
- artikkeli
- AS
- pyytäminen
- oletettu
- At
- Hyökkäykset
- välttää
- tietoinen
- taustaosa
- BE
- Pavunvarsi
- tulee
- ollut
- ennen
- takana
- kulissien takana
- ovat
- Paremmin
- Bitti
- Tukkia
- esto
- Blocks
- reunus
- Tauko
- rakennettu
- mutta
- by
- CAN
- Voi saada
- joka
- tapaus
- aiheutti
- aiheuttaen
- tietty
- merkki
- merkkejä
- tarkkailun
- koodi
- yhdistelmä
- kommentit
- yritys
- monimutkainen
- monimutkainen
- laskennallinen
- liitäntä
- korjata
- voisi
- pystynyt
- Crash
- Crashed
- Crashing
- luoda
- asiakas
- Asiakkaat
- tiedot
- käsiteltävä
- päätti
- käyttöön
- Kehittäjä
- DID
- ei tehnyt
- do
- verkkotunnuksen
- Don
- alas
- kaksi
- kukin
- helpompaa
- muu
- sähköpostit
- loppu
- päättyi
- päättyy
- enter
- Koko
- virheet
- erityisesti
- Jopa
- lopulta
- Joka
- jokainen
- kaikki
- esimerkki
- kallis
- experience
- lauseke
- epäonnistumisia
- melko
- paljon
- Ominaisuus
- Ominaisuudet
- harvat
- Kuva
- kuviollinen
- Löytää
- loppu
- Etunimi
- Korjata
- Keskittää
- seurannut
- jälkeen
- varten
- Entinen
- alkaen
- saada
- saada
- gif
- mennä
- tietty
- hyvä
- suuri
- ohjaavat
- HAD
- kahva
- Vetimet
- käytännön
- tapahtui
- Happening
- Olla
- auttaa
- auttaa
- Toivon mukaan
- TUNTIA
- liihottaa
- Miten
- HTTPS
- i
- ID
- if
- in
- mukana
- panos
- sen sijaan
- tulee
- kysymys
- kysymykset
- IT
- itse
- Job
- vain
- säilytetään
- Tietää
- Sukunimi
- myöhemmin
- oppinut
- oppiminen
- Pituus
- Lessons
- antaa
- Taso
- LG
- Kirjasto
- pitää
- Todennäköisesti
- ll
- paikallisesti
- hakkuu
- Pitkät
- kauemmin
- Katsoin
- erien
- Makro
- tehty
- käsin
- monet
- Marketing
- ottelu
- matching
- ehkä
- me
- Muisti
- minuuttia
- virheitä
- Moderni
- nykyaikaiset tekniikat
- lisää
- eniten
- paljon
- moninkertainen
- täytyy
- kapea
- syntyperäinen
- tarvitaan
- ei ikinä
- Uusi
- Uudet ominaisuudet
- seuraava
- Nro
- solmu
- Node.js
- Ilmoittamisesta
- numero
- Todennäköisyys
- of
- on
- ONE
- avata
- or
- Muut
- meidän
- ulos
- oma
- Kipu
- osa
- erityinen
- Kuvio
- Ihmiset
- Platon
- Platonin tietotieto
- PlatonData
- Viestejä
- mahdollinen
- Käytännön
- estää
- todennäköisesti
- Ongelma
- prosessi
- tuotanto
- Tuotteemme
- kysymykset
- nopea
- nopeasti
- melko
- satunnainen
- RE
- tavoittaa
- tajusi
- reason
- kohtuullinen
- sai
- reconnect
- regex
- säännöllinen
- muistutus
- poistaa
- poistamalla
- edustaa
- oikein
- Rengas
- Sääntö
- ajaa
- juoksu
- s
- SaaS
- takeita
- sama
- kohtaukset
- Haku
- näytti
- näennäisesti
- lähettäjä
- Sarjat
- palvelin
- palvelu
- varjo
- Jaa:
- jakaminen
- arkki
- shouldnt
- Yksinkertainen
- koska
- nukkua
- So
- Ratkaisumme
- jonkin verran
- Joku
- jotain
- Tila
- erityinen
- piikki
- Stackabus
- standardit
- alkoi
- Yhä
- stop
- verkkokaupasta
- Tarina
- järjestelmä
- ottaa
- Puhua
- Technologies
- tilapäinen
- testattu
- testit
- teksti
- kuin
- että
- -
- heidän
- Niitä
- sitten
- Siellä.
- Nämä
- ne
- asia
- asiat
- ajatella
- tätä
- aika
- kertaa
- että
- liian
- siirtyminen
- kokeillut
- Luottamus
- yrittää
- VUORO
- Kääntyminen
- tyyppi
- tyypit
- ymmärtää
- valitettavasti
- asti
- päivitetty
- us
- käyttää
- käytetty
- käyttäjä
- Käyttäjät
- käyttämällä
- eri
- Ve
- hyvin
- kautta
- Näytä
- odotus
- haluta
- halusi
- oli
- ei ollut
- katsomassa
- Tapa..
- we
- sivustot
- viikkoa
- HYVIN
- meni
- olivat
- Mitä
- kun
- joka
- koko
- miksi
- wikipedia
- toivottaa
- with
- Referenssit
- työntekijä
- työskentely
- olisi
- kirjoittaminen
- vuotta
- Voit
- Sinun
- zephyrnet