Visittelleren som gjorde produktkatalogen vår om til en 502

Levering

Siden som viser alle kitene vi selger, svarte hver besøkende med en 502 Bad Gateway i omtrent 41 timer etter lansering. Hver kites egen side fungerte, forsiden fungerte, kassen fungerte. Det som var ødelagt, var noen få linjer som telte sidevisninger.

Feilen

Serveren i butikken vår teller besøk på kitesider. For å finne ut hvilken kit en forespørsel gjelder, tok den den andre delen av stien:

self._count_view(path.strip("/").split("/")[1] if path.count("/") >= 2 else "")

For /kits/studio/ er det studio. For selve katalogen, /kits/, har stien to skråstreker, så sikringen slapp den gjennom, men etter å ha fjernet skråstrekene er det bare én del igjen, og [1] utløste en IndexError. Håndtereren er Pythons standard http.server: en unntak i do_GET lukker tilkoblingen uten svar, og Cloudflare viste besøkende en 502.

Fiksen er én liten funksjon som returnerer en tom streng når delen mangler. Visittellingen trengte bare navnet på kitet; den trengte aldri å kunne ødelegge siden den telte på.

Hvorfor ingen av sjekkene våre oppdaget det

Hva endret seg

Konklusjonen

Biarbeid i en forespørselshåndterer, som telling, logging eller sporing, må aldri kunne feile forespørselen, og en sidesjekk som bare dekker sidene du nettopp endret, går glipp av de som lenker til dem. Overvåkeren i Night Watch tar imot en hvilken som helst liste over sider, hver med tekst den må inneholde, ikke bare startsider.

Oppdatert: