NyheterSantoso Foto | VideoKontakt

En hemsida utan PHP

Två allvarliga hål i PHP har gjort att WordPress-sidor över hela världen utsätts för angreppsförsök just nu. En hemsida som inte kör PHP har inget sådant hål. Här berättar jag hur jag byggde två sådana med Claude Code.

9 min läsning

AI-bild · GPT Image 2.5 Flare (OpenAI, via Kie AI)

”A documentary-style photograph seen from a high angle, looking down at roughly 60 degrees from above, of a man …”

”A documentary-style photograph seen from a high angle, looking down at roughly 60 degrees from above, of a man and a woman in their thirties leaping across a calm, clear Swedish river in late afternoon light. The stepping stones are words. Each word is made of separate, large, bold capital letters, every letter its own solid block of smooth grey granite in a clean, heavy sans-serif letterform with crisp straight edges and flat tops. Within each word the letters stand upright side by side, all the same height, all facing the same direction and in a straight line, so every word reads normally from left to right, like monumental stone sculpture, with only a little wetness and moss at the waterline. Between the words there are clear gaps of open water. The six words form a winding path across the water from the lower left to the upper right, in this order: "PHP", "WORDPRESS", "MYSQL", "CSS", "DRUPAL", "JOOMLA" — each spelled exactly like that, with no extra letters, dots or marks. The man is mid-air between "MYSQL" and "CSS", the woman lands on top of the letters of "CSS" with her arms out for balance. Both have their backs partly turned to the camera and look forward along the path toward "DRUPAL" and "JOOMLA", focused on the next stone; neither looks at the camera. Casual outdoor clothes, small backpacks and sneakers. Small splashes and ripples around the letters, the clear water showing pebbles on the riverbed. Warm golden side light with long shadows from the letters across the water. Natural colours, a real photograph, not an illustration. No other text, signs or logos anywhere in the image.”

Förra veckan släppte PHP en rättelse för två hål som gör det möjligt att ta över en server utan att logga in. PHP är språket som WordPress, Drupal, Joomla och en stor del av alla hemsidor i världen körs på. Angreppsförsöken började innan rättelsen var ute.

Mina egna hemsidor berördes inte. De kör inte PHP alls. Här är hur de är byggda och hur du kan göra likadant.

I den här texten:

Vad hände med PHP?

Den 20 oktober varnade PHP för en kritisk säkerhetsrättelse. Detaljerna läckte innan den var klar. Dagen efter, den 21 oktober, kom nya versioner av PHP: 8.5.12, 8.4.27, 8.3.36 och 8.2.35.

Hålen har fått nummer CVE-2026-109618 och CVE-2026-109619. Båda har fått 9,2 av 10 i allvarlighet. Enligt PHP kan de låta någon köra egen kod på servern utan att vara inloggad. Risken är störst på servrar som kör Apache med mod_php, en vanlig uppsättning hos webbhotell.

Hålen sitter i PHP självt, inte i WordPress eller i något tillägg. Det spelar alltså ingen roll hur väl du har skött din WordPress. WordPress.org har sagt att ingen uppdatering av WordPress behövs eller planeras. Det är servern som måste uppdateras.

Webbhotell rapporterade angreppsförsök redan på morgonen den 21 oktober, flera timmar innan rättelsen släpptes. Flera tjänster stängdes ner i förebyggande syfte, bland annat den nederländska statens inloggning DigiD.

Har du en WordPress-sida: fråga ditt webbhotell om uppdateringen från 21 oktober är installerad. Kör du en egen server är det du som måste uppdatera.

Det här kommer att hända oftare

Hålen hittades inte av en människa som satt och läste kod. Säkerhetsföretaget Wiz hittade dem i augusti med hjälp av AI-modeller. Enligt Wiz gjorde Googles Gemini den största insatsen, både med att hitta felet och med att bygga en fungerande attack. Felet hade legat i PHP i mer än tio år utan att någon sett det.

Den här gången gick det rätt till. Wiz rapporterade hålen till PHP, som fick två månader på sig att rätta dem innan något blev offentligt. Men samma sorts verktyg finns för den som vill angripa.

AI gör det billigare att leta efter hål. Fler kommer att hittas och tiden från att ett hål blir känt till att det angrips blir kortare. CERT-EU, EU-institutionernas säkerhetsorganisation, skrev i april att angrepp i dag ofta kommer innan det ens finns en rättelse. Deras första råd är att stänga av det som ligger ute på internet utan att behövas.

Det rådet är lätt att följa för en hemsida. Varje del som körs på en server är en möjlig ingång. Ju färre sådana delar, desto mindre finns det för en AI att hitta.

Varför en statisk sida klarar sig

På en WordPress-sida körs PHP varje gång någon besöker sidan. Servern hämtar text ur en databas, kör tilläggen och bygger ihop sidan i stunden. Varje besök är ett tillfälle att skicka in något som servern inte borde ta emot.

En statisk sida byggs en gång. Sidorna blir färdiga HTML-filer som läggs ut på ett nät av servrar. När du besöker sidan får du en fil. Ingen kod körs och det finns ingen databas att fråga. Det finns inget PHP att angripa.

WordPress

Byggs vid varje besök

PHP, en databas och tillägg från många olika utvecklare. Servern ska uppdateras, WordPress ska uppdateras och varje tillägg ska uppdateras.

Statisk

Byggs en gång

Färdiga filer som skickas ut. Det som behöver köras på en server är några få små funktioner. Plattformen sköter servrarna.

Båda hemsidorna ligger på Vercel. Varje gång jag sparar en ändring i GitHub byggs sidan om och läggs ut automatiskt.

Tre ord kommer tillbaka i resten av texten:

  • GitHub är en tjänst där koden till en hemsida sparas. Varje ändring blir en egen version, så det går alltid att se vad som ändrats och att gå tillbaka.
  • Vercel är en tjänst som bygger hemsidan och lägger ut den. Den hämtar koden från GitHub, gör om den till färdiga filer och sprider dem till servrar runt om i världen. De få funktioner som måste köras på en server körs också där. Du behöver aldrig själv sköta en server.
  • JS står för Javascript, programspråket som webbläsare förstår. Next.js och Astro är verktyg skrivna i Javascript som bygger hemsidor. På en statisk sida körs Javascript när sidan byggs och i besökarens webbläsare. De få funktioner som körs på en server är också skrivna i Javascript, inte i PHP.

Inga Konstigheter: text-TV för 302 avsnitt

ingakonstigheter.nu är hemsidan för YouTube-kanalen Inga Konstigheter, som jag startade tillsammans med figgehn 2018. Den är byggd i Next.js och konceptet tog jag fram tillsammans med Claude Code.

Sidan ser ut som Text-TV, sida 100. Hela videobiblioteket ligger som ett index med sidnummer och speltid. Bilden från videon syns först när du pekar på en rad.

  • Hela biblioteket. Alla 302 avsnitt ligger i listan. Tio visas först och fler laddas när du skrollar.
  • Filter. Alla, live, shorts och avsnitt. Samma filter ligger i en fast rad längst ner, som de färgade knapparna på en Text-TV.
  • Sidnummer. Skriv tre siffror var som helst på sidan. 100 är förstasidan, 101 är senaste avsnittet och 700 är kontakt.
  • Videon laddas vid klick. Sidan laddar aldrig 302 YouTube-spelare. En spelare öppnas först när du väljer ett avsnitt. Den kommer från YouTubes version utan kakor.
  • Listan uppdateras med ett kommando. Ett skript läser kanalens spellista utan någon nyckel och sparar den som en fil. Skriptet vägrar spara om det hittar mycket färre avsnitt än förra gången, så att en ändring hos YouTube inte kan tömma listan.
  • Kontaktformulär. Det skickar ett mail genom tjänsten Resend. Det är en liten funktion på Vercel, inte PHP.
  • Samtycke först. Google Analytics ligger avstängt i sidan och slås på först när besökaren har tackat ja.

Santoso.se: en portfölj med eget redaktionsverktyg

Den här hemsidan byggdes om i september. Den är gjord i Astro och byggs till 43 färdiga sidor på ungefär 15 sekunder.

Det jag saknade mest från WordPress var att kunna skriva en nyhet utan att röra kod. Det löste jag med Keystatic, ett redigeringsverktyg som sparar texterna som filer i GitHub i stället för i en databas.

  • Redigering på svenska. På /keystatic finns tre knappar som i WordPress: Spara, Förhandsgranska och Publicera. En sparad text syns inte på hemsidan förrän jag publicerar den. Då är den ute efter ungefär en halv minut.
  • Uppdrag med egna sidor. Varje kund har en sida på /uppdrag och listan går att filtrera.
  • Galleri och film. Alla bilder går att öppna i en egen visare. Bilderna görs om till rätt storlek när sidan byggs, så att mobilen inte laddar originalet.
  • Kundgallerier. Kunder hämtar sina bilder på /kund med en kod. Bilderna ligger hos Cloudflare och i Google Foto, inte på hemsidan.
  • Mätning. Förfrågningar, klick på mail och telefon och öppnade filmer räknas i Google Analytics, efter samtycke.

Förhandsgranskningen, publiceringen, kundgallerierna och kontaktformuläret är de enda delarna som körs på en server. De är små funktioner hos Vercel. Resten är färdiga filer.

Så bygger Claude Code en hemsida

Jag beskriver vad jag vill ha på svenska. Claude Code skriver koden, bygger sidan, öppnar den i en webbläsare för att se att den fungerar och sparar ändringen.

För Inga Konstigheter började det med att agenten intervjuade mig. Vilka besöker sidan? Vad ska de göra där? Vad får sidan aldrig säga? Svaren sparades i en fil som agenten läser varje gång. Där står till exempel att inga siffror, citat eller länkar får hittas på. Det som inte finns i underlaget utelämnas.

Det tar fortfarande tid. Santoso.se har över hundra sparade versioner sedan ombyggnaden. Men tiden går till att bestämma hur något ska fungera, inte till att skriva kod.

Jag har skrivit mer om filen med regler i Skriv ner hur du vill ha det.

Inte osårbar

En statisk sida är inte osårbar. Den har färre ställen att angripa.

Koden bygger på paket från andra utvecklare, precis som tilläggen i WordPress. Paketen behöver uppdateras och de kan ha egna hål. AI letar lika gärna efter hål i dem. Skillnaden är att de används när sidan byggs. Det är inte de som tar emot besökarna.

De små funktionerna som körs på en server ska också skötas. Kontaktformuläret ska inte gå att använda för att skicka skräppost. Kundgallerierna ska inte visa en kunds bilder för någon annan. Det är sådant du ber agenten kontrollera och testa.

När WordPress fortfarande är rätt

WordPress är inte dåligt. För en webbutik med lager, betalning och frakt finns det få saker som slår WooCommerce. Har du många redaktörer som vill ha ett välkänt verktyg är WordPress ett tryggt val.

PHP är inte heller dåligt. Språket har burit en stor del av webben i trettio år och den här gången kom rättelsen dagen efter varningen. Men en sida som kör PHP behöver underhåll. Servern, WordPress och varje tillägg ska uppdateras, ibland samma dag som en rättelse släpps. Med ett webbhotell som sköter det eller någon som håller koll åt dig fungerar det bra. Det som går illa är sidan som byggdes för fem år sedan och sedan lämnades.

Men för en portfölj, en hemsida för ett företag eller en kanal behövs sällan en server som bygger varje sida på nytt. Där är en statisk sida snabbare, billigare och har mindre att uppdatera.

Så gör du själv

  1. Börja med vad sidan ska göra Be agenten intervjua dig först. Vilka besöker sidan och vad ska de göra där? Spara svaren i en fil.
  2. Be om en statisk sida Säg att du vill ha en statisk sida, till exempel i Astro. Då blir sidorna färdiga filer.
  3. Lägg den i GitHub och på Vercel Netlify och Cloudflare fungerar också. Alla har en gratisnivå att börja med. Varje ändring läggs ut automatiskt.
  4. Använd tjänster för det som måste köras Ett kontaktformulär kan skicka mail med en tjänst som Resend. Du behöver ingen egen server.
  5. Lägg till ett redigeringsverktyg om andra ska skriva Keystatic ger dig en adminyta utan databas.
  6. Skriv ner reglerna Språk, ton och vad som aldrig får ändras. Då gör agenten rätt även nästa gång.

Vill du ha hjälp att flytta din hemsida från WordPress? Hör av dig.

Läs vidare

Alla texter →