Wie diese Prüfung funktioniert
Scanaris liest die Header der Hauptantwort deiner Seite und schaut sich zwei davon an. Ist X-Powered-By mit irgendeinem Wert vorhanden (zum Beispiel Express, PHP/8.2.12 oder Next.js), öffnet er einen Befund mit niedrigem Schweregrad. Ist Server vorhanden und enthält der Wert eine Versionsnummer (etwa nginx/1.18.0 oder Apache/2.4.57), öffnet er einen weiteren. Ein bloßes Server: nginx oder Server: cloudflare wird nicht gemeldet: Zu sagen, welchen Server du nutzt, ist kein Problem; zu sagen, welche Version genau, schon.
Warum das wichtig ist
Keiner der beiden Header bringt dem Nutzer oder dem Browser irgendetwas. Sie existieren aus Gewohnheit. Was sie tun, ist, demjenigen Arbeit zu ersparen, der eine Schwachstelle sucht: Mit PHP/7.4.3 oder Apache/2.4.49 in der Antwort muss der Angreifer nichts raten, er geht direkt zur Liste der bekannten Fehler dieser Version und probiert die mit öffentlichem Exploit. Es ist ein Befund mit niedrigem Schweregrad, weil er allein keine Tür öffnet; aber er gehört zu den am leichtesten zu schließenden, und Massenscanner filtern ihre Ziele genau über diese Header.
So entfernst du sie je nach Stack
- Express:
app.disable('x-powered-by')beim Erstellen der App, oder nutzehelmet(), das ihn zusammen mit weiteren Härtungen entfernt. - Next.js: sendet standardmäßig
X-Powered-By: Next.js. Innext.config.js:poweredByHeader: false. - PHP: in
php.iniexpose_php = Off. Bei Shared Hosting lässt sich das meist im Panel oder über eine.user.iniändern. - ASP.NET: in
web.configuntercustomHeaders<remove name="X-Powered-By" />, und in IIS zusätzlich den HeaderX-AspNet-VersionmitenableVersionHeader="false"abschalten. - nginx:
server_tokens off;imhttp-Block. Es steht weiterhin „nginx", aber ohne Version. - Apache:
ServerTokens ProdundServerSignature Offin der Hauptkonfiguration. MitProdbleibt im Header nurApache. - Vercel, Netlify, Cloudflare Pages: senden keine Version in
Server. Siehst du dortX-Powered-By, kommt es von deinem Framework (Next.js oder Express), nicht von der Plattform.
Wenn ein Proxy oder CDN davor sitzt (Cloudflare, ein Load Balancer), prüf die öffentliche Antwort: Manchmal ersetzt der Proxy den Server-Header und das Problem verschwindet von selbst, aber X-Powered-By geht meist unverändert durch.
Prüf, ob es behoben ist
curl -sI https://deinedomain.de | grep -iE "^(server|x-powered-by):"
Ideal ist, dass X-Powered-By nicht erscheint und Server, falls vorhanden, keine Nummer trägt. Probier auch eine API-Route oder eine Fehlerseite (eine URL, die nicht existiert): Fehler werden manchmal in einer anderen Schicht erzeugt, die den Header wieder hinzufügt.
Häufige Fragen
Die Version zu verstecken behebt die Schwachstelle nicht. Wozu dann?
Um nicht auf der ersten Ergebnisseite dessen zu landen, der Opfer sucht. Du hast recht, die eigentliche Lösung ist das Update: Die Version zu verstecken ist die Ergänzung, nicht der Ersatz. Beides zusammen dauert fünf Minuten.
Mein Hoster lässt mich die Serverkonfiguration nicht anfassen.
Dann entferne wenigstens X-Powered-By aus deinem Code oder deiner .htaccess (Header unset X-Powered-By) und bitte den Hoster, die Version zu verbergen. Die anderen Sicherheits-Header, die du haben solltest, prüft die Kontrolle Sicherheits-Header.
Warum wird „Server: cloudflare" nicht gemeldet?
Weil es nichts Verwertbares verrät: weder Version noch konkrete Software dahinter. Gesucht wird hier Information, die den Weg zu einem Exploit verkürzt. Welche Header sich lohnen und welche nur Rauschen sind, steht in HTTP-Header für Menschen erklärt.