Kort sagt: PHP, Node.js, Python og Java egner sig alle til webapplikationer; de adskiller sig først og fremmest i, hvordan kode udføres og drives. Klassisk PHP starter hver forespørgsel med tom tilstand, Node.js arbejder med en event loop i en langlivet proces, Python-webapplikationer kører via en grænseflade som WSGI, Java-applikationer i en vedvarende kørende JVM. Intet af disse sprog er af sig selv sikkert eller usikkert. Forskellen gør aktuelle runtimes, vedligeholdte afhængigheder og en patch-proces, der også omfatter genstarter.
Hvorfor sammenligningen stilles efter PHP2Shell
Når en sårbarhed som PHP2Shell gør overskrifter, og BSI udråber advarselsniveau orange, spørger ledelser med rette: Ville det ikke være sket med et andet sprog? Det ærlige svar lyder: En sårbarhed netop af denne art ikke, andre sårbarheder ja. Hvert kørselsmiljø er software, og hvert har i sin historie haft kritiske fejl.
Sammenligningen er alligevel givtig, fordi modellerne har forskellige styrker og risici. Den, der kender dem, træffer arkitekturbeslutninger mere bevidst. Markedsandele spiller her ingen rolle; vi undlader tal, fordi de tilgængelige undersøgelser måler forskellige ting.
Kørselsmodellerne i overblik
| Kendetegn | PHP | Node.js | Python | Java |
|---|---|---|---|---|
| Typisk udførelse | workers behandler forespørgsler, tilstand pr. forespørgsel | én langlivet proces med event loop | applikation bag en applikationsserver, grænseflade WSGI | langlivet applikation i JVM'en |
| Tilstand mellem forespørgsler | klassisk kasseret, bevaret i worker-tilstande | forbliver i processen | forbliver i processen | forbliver i processen |
| Pakkestyring | Composer | npm | pip | Maven, Gradle |
| Typisk hosting | shared hosting til container | egen server, container, platformtjenester | egen server, container, platformtjenester | applikationsserver, container |
| Udbredte anvendelsesområder | CMS, shops, portaler | realtid, API'er, frontend-nære tjenester | dataanalyse, API'er, automatisering | store virksomhedsapplikationer |
En bemærkning om Node.js fra dets egen dokumentation: Event loopen tillader ikke-blokerende input og output, selv om der som standard kun kører én JavaScript-tråd. For Python fastlægger PEP 3333 grænsefladen mellem webserver og Python-applikation.
PHP's styrker
PHP blev bygget til nettet, og det mærker man i driften. Næsten alle hostingudbydere tilbyder PHP, fra den lille webplads til datacentret. Systemer som WordPress, TYPO3, Shopware, Drupal eller Nextcloud kører på det, ligeledes frameworks som Laravel og Symfony.
Den klassiske model har en indbygget fordel for stabiliteten: Fordi hver forespørgsel begynder med tom tilstand, slæber hukommelseslækager eller fejlbehæftede tilstande sig næppe fra forespørgsel til forespørgsel. En fejl berører som regel kun den ene forespørgsel. Hvordan dette forløb fungerer i detaljer, forklarer request-livscyklussen.
Moderne PHP-versioner bringer strikte typer, enums, attributter og en JIT-compiler med. PHP-projektet udgiver versioner i en fast rytme med to års aktiv understøttelse og to års sikkerhedsrettelser.
Alternativernes styrker
Node.js spiller sine styrker ud ved mange samtidige forbindelser, f.eks. ved chats, live-data eller WebSockets. Frontend og backend kan bruge det samme sprog.
Python er stærkt, når webapplikationer forbindes med dataanalyse, maskinlæring eller automatisering, fordi bibliotekerne hertil har hjemme i Python.
Java er udbredt i store organisationer, der har brug for lange livscyklusser, stærk typning og modne værktøjer til meget store kodebaser.
Ingen af disse styrker gør et sprog til det bedre valg til et virksomhedswebsite eller en onlineshop, der kører på et etableret PHP-system. Valget afhænger snarere af det eksisterende team, systemlandskabet og kravene. Et overblik over PHP-siden giver PHP-frameworks i overblik.
Sikkerhed i sammenligning: hvad der virkelig tæller
Ved sikkerhed lønner et blik på tre niveauer, som er lige vigtige i alle fire verdener:
- Runtime: Fortolker eller virtuel maskine skal være aktuel. Ved PHP2Shell lå sårbarheden i PHP selv; ved andre runtimes var og er der egne sikkerhedsopdateringer. Overalt gælder: Efter opdateringen skal kørende processer genstartes.
- Afhængigheder: Composer, npm, pip og Maven henter fremmed kode ind i projektet. Log4Shell var en sårbarhed i et Java-bibliotek, ikke i Java selv. Sammenligningen af de to tilfælde foretager PHP2Shell og Log4Shell.
- Egen kode: OWASP Top 10 gælder for ethvert sprog. SQL-injection, fejlbehæftet adgangskontrol eller usikker konfiguration opstår i Node.js ligeså vel som i PHP.
En forskel i modellen er bemærkelsesværdig: Langlivede processer, som er sædvanlige i Node.js-, Python- eller Java-applikationer, holder bevidst tilstand på tværs af forespørgsler. Adskillelsen mellem forespørgsler ligger dér i applikationens ansvar. Klassisk PHP nulstiller derimod selv tilstanden; CVE-2026-109619 viste, hvad der sker, når denne nulstilling inde i PHP er fejlbehæftet. Begge modeller har altså deres eget sted, hvor tilstand skal adskilles rent.
Et sprogskifte erstatter ikke patch-management. Den, der i dag ikke kan indspille PHP-opdateringer hurtigt, vil have det ligeså svært med en anden runtime.
Hvordan hjælper PHP SOS konkret?
- Vurdere situationen: Vi vurderer, om jeres risiko ligger i sproget, i versionen eller i driften.
- Kontrollere nutilstanden: Runtime-versioner, afhængigheder og konfiguration, også ved blandede landskaber med PHP og andre sprog.
- Teste applikationen: I sikkerhedsaudit og penetrationstest gennemgår vi jeres applikation uafhængigt af sproget.
- Forberede beslutningen: Hvis et skifte er på tale, stiller vi omkostninger, risici og alternativer sagligt over for hinanden.
Ofte stillede spørgsmål
Er PHP mere usikkert end Node.js, Python eller Java?
Ikke i princippet. Ethvert kørselsmiljø har sikkerhedssårbarheder, og Java havde med Log4Shell en særlig kendt i et bibliotek. Afgørende er aktuelle versioner, vedligeholdte afhængigheder og en fungerende patch-proces.
Bør vi skifte sprog efter PHP2Shell?
Et sprogskifte er et stort projekt og løser ikke grundproblemet: Også andre runtimes har brug for opdateringer og genstarter. Fornuftigere er som regel at holde PHP aktuel og hærde driften.
Hvad betyder shared nothing ved PHP?
I klassisk drift begynder hver forespørgsel med tom applikationstilstand og frigiver sin hukommelse til sidst. Data mellem forespørgsler ligger i database, cache eller session, ikke i processen.
Hvilket sprog er hurtigst?
Det afhænger stærkt af opgaven. Ved typiske webapplikationer bestemmer database, netværk og arkitektur som regel svartiden stærkere end sproget. Generelle rangordener hjælper lidt ved beslutningen.