2010-02-23 10 views
39

Ich weiß in PHP, sendet es die X-Powered-By-Header, um die PHP-Version zu haben.Versteckt PHPs X-Powered-By-Header

Ich weiß auch, indem Sie einige Prüfsummen anhängen, können Sie Zugriff auf PHP-Guthaben und einige zufällige Bilder (more info here) bekommen.

Ich weiß auch in php.ini können Sie expose_php = off drehen.

Aber hier ist etwas, das ich auf ein paar Seiten getan haben, und das ist

header('X-Powered-By: Alex'); 

verwenden Wenn ich die Header zu sehen, kann ich sehen, dass es nun ‚Alex‘ ist statt der PHP-Version. Meine Frage ist, werden diese zunächst die vorherigen PHP-Header senden (bevor es meine header() erreicht, und es ist nachweisbar von jedem Sniffer-Programm? Oder ist headers ‚gesammelt‘ von PHP, vor wird zurück an den Browser gesendet?

By the way, ist diese Sicherheit nicht durch Verschleierung, einfach nur neugierig, wie Header in PHP arbeitet

+2

Warum hatte niemand ['header_remove'] vorgeschlagen (http://stackoverflow.com/a/17368552/632951)? – Pacerier

Antwort

16

In PHP werden Header nicht gesendet, bis PHP seine erste Ausgabe Aussage trifft.

Dies umfasst alles vor dem ersten <?php. Diese

ist auch, warum setcookie sendet wirft eine Warnung, wenn Sie versuchen, es zu verwenden, nachdem etwas ausgegeben wurde:

Warnung: Kann nicht Header Informationen ändern - headers already von (Ausgang bei gestartet gesendet/path/to/php/file.php: 100) in /path/to/php/file.php auf Leitung 150

zu beachten, dass keines Dies gilt, wenn output buffering in Gebrauch ist, da der Ausgang nicht bis zum entsprechenden Ausgabebuf gesendet werden Fering-Befehl wird ausgeführt.

25

siehe Apache Tips & Tricks: Hide PHP version (X-Powered-By)

Ups ... Da wir ein eigenes PHP fügt banner sehen.

X-Powered-By: PHP/5.1.2-1+b1… 

Mal sehen, wie wir es deaktivieren können. In um PHP aus Freilegung der Tatsache zu verhindern, dass es auf dem Server installiert ist, durch seine Unterschrift auf dem Web-Server-Header hinzugefügt wir in php.ini die Variable expose_php und schalten Sie ihn off suchen müssen.

Standardmäßig ist expose_php auf Ein eingestellt.

In der php.ini (basierend auf dem Linux-Distribution dies in verschiedenen Orten gefunden werden, wie /etc/php.ini, /etc/php5/apache2/php.ini, etc.) lokalisieren die Zeile mit expose_php On und es auf Aus gesetzt:

expose_php = Off 

nach dieser Änderung wird PHP nicht mehr hinzuzufügen Unterschrift an den Web-Server -Header. Doing this, wird nicht machen Sie Ihren Server sicherer ... es wird nur Remote-Hosts zu einfach zu sehen, dass Sie PHP auf dem System installiert haben und welche Version Sie sind läuft.

+2

Aber das rät nur, 'expose_php = Off' in php.ini zu setzen, was Alex bereits in seinem Beitrag erwähnt hat. – Ludwig

3

Header werden von PHP "gesammelt", bevor sie zurück an den Browser gesendet werden, so dass Sie Dinge wie den Status-Header überschreiben können. Die Art und Weise, es zu testen geht, ist zu einer Eingabeaufforderung und geben Sie:

telnet www.yoursite.com 80 
GET /index.php HTTP/1.1 
[ENTER] 
[ENTER] 

Und Sie werden auf die Header, die in der Antwort gesendet werden (ersetzen /index.php mit der URL Ihrer PHP-Seite nach dem Domain.)

+1

Eine einfachere Möglichkeit, HTTP-Response-Header zu sehen, ist 'curl -I http: // hostname/path'. –

+1

Warum verwenden Sie eine GET-Anfrage anstelle einer HEAD-Anfrage? –

+0

@ kylek, Im Falle von Heisenbugs. Idealerweise möchten Sie beide testen. – Pacerier

29

Sie können expose_php = Off in Ihrer php.ini setzen, wenn Sie nicht möchten, dass X-Powered-By Header sendet.

PHP kompiliert zuerst alles (einschließlich welcher Header welche Werte haben) und startet dann die Ausgabe, nicht umgekehrt.

PHP ist auch mit seinem eigenen Ostereier nachweisbar, Sie zu diesem Thema hier lesen: PHP Easter Eggs

+3

+1 für die Eier. – Pacerier

1

Meine Frage ist, werden diese zunächst die vorherigen PHP-Header senden (bevor es meine header() erreicht, und es ist von jedem Sniffer-Programm nachweisbar? Oder ist headers ‚gesammelt‘ von PHP, bevor sie an den Browser zurückgeschickt werden ?

Nein, ist es nicht die vorherigen PHP-Header sendet zuerst. Header werden entweder gesendet oder nicht gesendet (in komplett, als eine Charge) in PHP. standardmäßig Ihren headerDocs Anruf einen vorherigen Header mit dem gleichen Namen ersetzt (es sei denn, Sie geben mit dem zweiten Parameter etwas anderes an)

Hinweis: Wenn PHP die Header nicht sammeln würde, könnte es keinen ersetzen.

Da es nicht früher gesendet wurde, ist es mit einem Sniffer-Programm nicht nachweisbar.

Also ja, Header werden von PHP gesammelt und werden gesendet, sobald die "echte" Ausgabe beginnt (HTTP response body).

Siehe auch headers_sentDocs.

2

Um den Header X-Powered-By loszuwerden, ohne Zugriff auf php.ini, einfach eine leere Kopfzeile hinzufügen.

<?php header('X-Powered-By:'); ?> 

Das überschreibt die Standard-X-Powered-By-Header mit einer leeren Wert ein, obwohl die meisten Clients und Anwendungen handeln, wie dieser Header nicht gesendet wurde.

Wie bereits erwähnt, muss dies in den Code eingefügt werden, bevor eine Ausgabe gesendet wird.

Und Ihre Frage zu beantworten:

Nur Ihre X-Powered-By-Header, da sie von der Kopfzeile mit dem gleichen Namen ersetzt gesendet werden wird. Es kann also von einem "Sniffer" nicht erkannt werden.

+0

Es entfernt nicht den Header, sondern setzt nur seinen Wert zurück. – Pacerier

Verwandte Themen