Dit artikel is het eerste in een reeks berichten die ik schrijf over het runnen van verschillende SaaS-producten en websites gedurende de afgelopen 8 jaar. Ik zal enkele van de problemen delen waarmee ik te maken heb gehad, de lessen die ik heb geleerd, de fouten die ik heb gemaakt en misschien een paar dingen die goed zijn gegaan. Laat het me weten Wat denk je!
In 2019 of 2020 had ik besloten om de hele backend voor te herschrijven Blokkeer de afzender, een SaaS-applicatie waarmee gebruikers onder meer betere e-mailblokken kunnen maken. Daarbij heb ik een paar nieuwe functies toegevoegd en een upgrade uitgevoerd naar veel modernere technologieรซn. Ik heb de tests uitgevoerd, de code geรฏmplementeerd, alles handmatig getest tijdens de productie, en afgezien van een paar willekeurige prullaria, leek alles prima te werken. Ik wou dat dit het einde van het verhaal was, maar...
Een paar weken later kreeg ik van een klant een melding (wat op zichzelf beschamend is) dat de service niet werkte en dat ze veel e-mails in hun inbox ontvingen die geblokkeerd moesten worden, dus ging ik op onderzoek uit. Vaak wordt dit probleem veroorzaakt doordat Google de verbinding van onze service met het account van de gebruiker heeft verwijderd, wat het systeem afhandelt door de gebruiker via e-mail op de hoogte te stellen en hem te vragen opnieuw verbinding te maken, maar deze keer was het iets anders.
Het leek erop dat de backend-medewerker die het controleren van e-mails aan de hand van gebruikersblokken afhandelde, elke 5-10 minuten crashte. Het raarste deel: er waren geen fouten in de logs, het geheugen was prima, maar de CPU piekte af en toe op schijnbaar willekeurige momenten. Dus de volgende 24 uur (met een slaappauze van 3 uur โ sorry klanten ๐ฌ) moest ik de werker handmatig opnieuw opstarten telkens wanneer deze crashte. Om de een of andere reden wachtte de Elastic Beanstalk-service veel te lang om opnieuw op te starten, daarom moest ik het handmatig doen.
Het debuggen van problemen in de productie is altijd lastig, vooral omdat ik het probleem niet lokaal kon reproduceren, laat staan โโachterhalen wat de oorzaak ervan was. Dus zoals elke โgoedeโ ontwikkelaar ben ik net begonnen met inloggen alles en wachtte tot de server opnieuw crashte. Omdat de CPU regelmatig piekte, dacht ik dat het geen macroprobleem was (zoals wanneer je onvoldoende geheugen hebt) en waarschijnlijk werd veroorzaakt door een specifieke e-mail of gebruiker. Dus ik probeerde het te beperken:
- Crashte het op een bepaald e-mailadres of type?
- Crashte het voor een bepaalde klant?
- Crashte het met regelmatige tussenpozen?
Na urenlang dit te hebben gedaan, en langer naar boomstammen te hebben gestaard dan ik zou willen, heb ik het uiteindelijk beperkt tot een specifieke klant. Vanaf dat moment werd de zoekruimte behoorlijk kleiner: het was hoogstwaarschijnlijk een blokkeerregel of een specifieke e-mail waarop onze server steeds opnieuw probeerde. Gelukkig voor mij was het het eerste, wat een veel gemakkelijker probleem is om te debuggen, aangezien we een zeer op privacy gericht bedrijf zijn en geen e-mailgegevens opslaan of bekijken.
Voordat we op het exacte probleem ingaan, zullen we het eerst hebben over een van de functies van Block Sender. Destijds had ik veel klanten die vroegen om wildcard-blokkering, waarmee ze bepaalde typen e-mailadressen konden blokkeren die hetzelfde patroon volgden. Als u bijvoorbeeld alle e-mails van marketing-e-mailadressen wilt blokkeren, kunt u het jokerteken gebruiken marketing@*
en het zou alle e-mails blokkeren van elk adres dat begon met marketing@
.
Eรฉn ding waar ik niet aan dacht, is dat niet iedereen begrijpt hoe wildcards werken. Ik ging ervan uit dat de meeste mensen ze op dezelfde manier zouden gebruiken als ik als ontwikkelaar, door er een te gebruiken *
om een โโwillekeurig aantal tekens weer te geven. Helaas ging deze specifieke gebruiker ervan uit dat je dit moest gebruiken รฉรฉn jokerteken voor elk teken dat je wilde matchen. In hun geval wilden ze alle e-mails van een bepaald domein blokkeren (wat een native functie is die Block Sender heeft, maar ze moeten zich dat niet hebben gerealiseerd, wat op zichzelf een heel probleem is). Dus in plaats van gebruiken *@example.com
, zij gebruikten **********@example.com
.
POV: Kijken hoe uw gebruikers uw app gebruikenโฆ
Om jokertekens op onze werkserver te verwerken, gebruiken we de Node.js-bibliotheek overeenkomst, wat helpt bij glob-matching door er een reguliere expressie van te maken. Deze bibliotheek zou dan draaien **********@example.com
in iets als de volgende regex:
/[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*[sS]*@example.com/i
Als je enige ervaring hebt met regex, weet je dat ze heel snel erg ingewikkeld kunnen worden, vooral op rekenniveau. Het matchen van de bovenstaande uitdrukking met een redelijke lengte tekst wordt erg rekentechnisch duur, waardoor de CPU op onze werkserver vast kwam te zitten. Dit is de reden waarom de server elke paar minuten crashte; het zou vastlopen bij het matchen van een complexe reguliere expressie aan een e-mailadres. Dus elke keer dat deze gebruiker een e-mail ontving, crashte onze server, naast alle nieuwe pogingen die we hadden ingebouwd om tijdelijke fouten op te lossen.
Dus hoe heb ik dit opgelost? De snelle oplossing was uiteraard om alle blokken met meerdere jokertekens achter elkaar te vinden en deze te corrigeren. Maar ik moest ook de input van gebruikers beter opschonen. Elke gebruiker kan een regex invoeren en het hele systeem uitschakelen met een ReDoS-aanval.
Bekijk onze praktische, praktische gids voor het leren van Git, met best-practices, door de industrie geaccepteerde normen en bijgevoegd spiekbriefje. Stop met Googlen op Git-commando's en eigenlijk leren het!
Het afhandelen van dit specifieke geval was vrij eenvoudig: verwijder opeenvolgende jokertekens:
block = block.replace(/*+/g, '*')
Maar dat laat de app nog steeds open voor andere soorten ReDoS-aanvallen. Gelukkig zijn er ook een aantal pakketten/bibliotheken die ons met deze typen kunnen helpen:
Door een combinatie van de bovenstaande oplossingen en andere voorzorgsmaatregelen te gebruiken, heb ik kunnen voorkomen dat dit opnieuw gebeurt. Maar het was een goede herinnering dat u gebruikersinvoer nooit kunt vertrouwen, en dat u deze altijd moet opschonen voordat u deze in uw toepassing gebruikt. Ik wist niet eens dat dit een mogelijk probleem was totdat het mij overkwam, dus hopelijk helpt dit iemand anders hetzelfde probleem te voorkomen.
Heeft u vragen, opmerkingen of wilt u uw eigen verhaal delen? Neem contact op Twitter!
- Door SEO aangedreven content en PR-distributie. Word vandaag nog versterkt.
- PlatoData.Network Verticale generatieve AI. Versterk jezelf. Toegang hier.
- PlatoAiStream. Web3-intelligentie. Kennis versterkt. Toegang hier.
- PlatoESG. carbon, CleanTech, Energie, Milieu, Zonne, Afvalbeheer. Toegang hier.
- Plato Gezondheid. Intelligentie op het gebied van biotech en klinische proeven. Toegang hier.
- Bron: https://stackabuse.com/behind-the-scenes-never-trust-user-input/
- : heeft
- :is
- :niet
- $UP
- 1
- 20
- 2019
- 2020
- 24
- 8
- a
- in staat
- Over
- boven
- Account
- werkelijk
- toegevoegd
- toevoeging
- adres
- adressen
- weer
- tegen
- Alles
- toelaten
- alleen
- ook
- altijd
- onder
- an
- en
- elke
- gebruiken
- Aanvraag
- ZIJN
- dit artikel
- AS
- vragen
- uitgegaan van
- At
- Aanvallen
- vermijd
- bewust
- backend
- BE
- Beanstalk
- wordt
- geweest
- vaardigheden
- achter
- Achter de schermen
- wezen
- Betere
- Beetje
- Blok
- blokkeren
- Blokken
- grens
- Breken
- bebouwd
- maar
- by
- CAN
- Kan krijgen
- verzorging
- geval
- veroorzaakt
- veroorzakend
- zeker
- karakter
- tekens
- controleren
- code
- combinatie van
- opmerkingen
- afstand
- complex
- ingewikkeld
- computationeel
- versterken
- te corrigeren
- kon
- couldn
- Neerstorten
- Crashed
- Crashing
- en je merk te creรซren
- klant
- Klanten
- gegevens
- behandeld
- beslist
- ingezet
- Ontwikkelaar
- DEED
- Jonathan Bourdon
- do
- domein
- don
- beneden
- twee
- elk
- gemakkelijker
- anders
- e-mails
- einde
- afgelopen
- eindigt
- Enter
- Geheel
- fouten
- vooral
- Zelfs
- uiteindelijk
- Alle
- iedereen
- alles
- voorbeeld
- duur
- ervaring
- uitdrukking
- mislukkingen
- tamelijk
- ver
- Kenmerk
- Voordelen
- weinig
- Figuur
- bedacht
- VIND DE PLEK DIE PERFECT VOOR JOU IS
- einde
- Voornaam*
- Bepalen
- Focus
- gevolgd
- volgend
- Voor
- Voormalig
- oppompen van
- krijgen
- het krijgen van
- gif
- Git
- gegeven
- goed
- Kopen Google Reviews
- groot
- gids
- HAD
- handvat
- Handvaten
- hands-on
- gebeurd
- Happening
- Hebben
- hulp
- helpt
- Hopelijk
- HOURS
- zweven
- Hoe
- HTTPS
- i
- ID
- if
- in
- inclusief
- invoer
- verkrijgen in plaats daarvan
- in
- kwestie
- problemen
- IT
- zelf
- Jobomschrijving:
- voor slechts
- gehouden
- blijven
- Achternaam*
- later
- geleerd
- leren
- Lengte
- Lessen
- laten
- Niveau
- LG
- Bibliotheek
- als
- Waarschijnlijk
- ll
- plaatselijk
- logging
- lang
- langer
- keek
- veel
- Macro
- gemaakt
- handmatig
- veel
- Marketing
- Match
- matching
- kan zijn
- me
- Geheugen
- minuten
- fouten
- Modern
- moderne technologieรซn
- meer
- meest
- veel
- meervoudig
- Dan moet je
- smal
- inheemse
- nodig
- nooit
- New
- Nieuwe mogelijkheden
- volgende
- geen
- knooppunt
- Node.js
- melden
- aantal
- Kansen
- of
- on
- EEN
- open
- or
- Overige
- onze
- uit
- het te bezitten.
- Pijn
- deel
- bijzonder
- Patronen
- Mensen
- Plato
- Plato gegevensintelligentie
- PlatoData
- Berichten
- potentieel
- PRAKTISCH
- voorkomen
- waarschijnlijk
- probleem
- productie
- Producten
- Contact
- Quick
- snel
- heel
- willekeurige
- RE
- bereiken
- realiseerde
- reden
- redelijk
- ontvangen
- Reconnect
- regex
- regelmatig
- herinnering
- verwijderen
- het verwijderen van
- vertegenwoordigen
- rechts
- Ring
- Regel
- lopen
- lopend
- s
- SaaS
- waarborgen
- dezelfde
- Scenes
- Ontdek
- scheen
- schijnbaar
- afzender
- -Series
- server
- service
- Shadow
- Delen
- delen
- vel
- moet
- Eenvoudig
- sinds
- slaap
- So
- Oplossingen
- sommige
- Iemand
- iets
- Tussenruimte
- specifiek
- aar
- Stapelmisbruik
- normen
- gestart
- Still
- stop
- shop
- Verhaal
- system
- Nemen
- Talk
- Technologies
- tijdelijk
- getest
- testen
- tekst
- neem contact
- dat
- De
- hun
- Ze
- harte
- Er.
- Deze
- ze
- ding
- spullen
- denken
- dit
- niet de tijd of
- keer
- naar
- ook
- overgang
- probeerden
- Trust
- proberen
- BEURT
- Draai
- type dan:
- types
- begrijpt
- helaas
- tot
- opgewaardeerd
- us
- .
- gebruikt
- Gebruiker
- gebruikers
- gebruik
- divers
- Ve
- zeer
- via
- Bekijk
- Het wachten
- willen
- gezocht
- was
- was
- kijken
- Manier..
- we
- websites
- weken
- GOED
- gegaan
- waren
- Wat
- wanneer
- welke
- geheel
- Waarom
- Wikipedia
- wensen
- Met
- Mijn werk
- werker
- werkzaam
- zou
- het schrijven van
- jaar
- You
- Your
- zephyrnet