web-dev-qa-db-ja.com

PHP X-Powered-Byヘッダーの非表示

PHPでは、X-Powered-Byヘッダーを送信してPHPバージョン。

また、いくつかのチェックサムを追加することで、PHPのクレジットとランダムな画像にアクセスできることを知っています( 詳細はこちら )。

Php.iniでexpose_php = offを有効にできることも知っています。

しかし、ここに私がいくつかのサイトでやったことがあります

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

ヘッダーを表示すると、PHPバージョンではなく 'Alex'になっていることがわかります。私の質問は、以前のPHPヘッダーが最初に(header()に到達する前に、スニファープログラムで検出可能ですか?または、ヘッダーがPHPによって「収集」されていますか、beforeブラウザに返送されていますか?

ちなみに、これはあいまいさによるセキュリティのためではなく、PHPでヘッダーがどのように機能するかを知りたいだけです。

42
alex

PHPでは、PHPが最初の出力ステートメントを検出するまでヘッダーは送信されません。

これには、最初の<?php

これは、何かが出力された後にsetcookieを使用しようとすると警告がスローされる理由でもあります。

警告:ヘッダー情報を変更できません-150行目の/path/to/php/file.phpの(/path/to/php/file.php:100で開始された)によって既に送信されたヘッダー

output buffering が使用されている場合、適切な出力バッファリングコマンドが実行されるまで出力は送信されないため、これは適用されません。

16
Powerlord

X-Powered-Byヘッダーを送信したくない場合は、php.iniでexpose_php = Offを設定できます。

PHPは最初にすべて(すべてのヘッダーがどの値を持つかを含む)をコンパイルしてから、その逆ではなく出力を開始します。

PHPは独自のイースターエッグでも検出できます。このトピックについては、こちらで読むことができます。 PHPイースターエッグ

33
Kemo

Apacheのヒントとコツ:非表示PHP version(X-Powered-By)

Ups…ご覧のとおり、PHPは独自のバナーを追加します。

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

無効にする方法を見てみましょう。 PHPがサーバーにインストールされているという事実を公開しないようにするには、Webサーバーのヘッダーに署名を追加して、php .ini変数expose_phpに変更し、offにします。

デフォルトでは、expose_phpはOnに設定されています。

Php.ini(Linuxディストリビューションに基づいて、これは/etc/php.ini、/etc/php5/Apache2/php.iniなどのさまざまな場所にあります)expose_php Onを含む行を見つけます。オフに設定します。

expose_php = Off

この変更を行った後PHPはWebサーバーヘッダーに署名を追加しなくなります。これを行うと、notmakeサーバーのセキュリティを強化します。システムにインストールされているPHPおよび実行しているバージョン)をリモートホストが簡単に確認できないようにします。

27
cletus

ヘッダーは、ブラウザーに送り返される前にPHPによって「収集」されるため、ステータスヘッダーなどをオーバーライドできます。テストする方法は、コマンドプロンプトに移動し、次のように入力します。

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

そして、応答で送信されたヘッダーが表示されます(/index.phpをPHPドメインの後のページ)のURLに置き換えます。)

3
Andy Shellam

Php.iniにアクセスせずにX-Powered-Byヘッダーを削除するには、単に空のヘッダーを追加します。

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

これはデフォルトのX-Powered-Byヘッダーを空の値で上書きしますが、ほとんどのクライアントとアプリケーションはこのヘッダーがまったく送信されなかったように動作します。

前に気づいたように、これは出力を送信する前にコードに挿入する必要があります。

そしてあなたの質問に答えるために:

同じ名前のヘッダーに置き換えられるため、X-Powered-Byヘッダーのみが送信されます。そのため、「スニファー」では検出できません。

2
Ludwig

私の質問は、これは以前のPHPヘッダーを最初に送信します(header()に到達する前に、スニファープログラムで検出可能ですか? PHP、ブラウザに送り返される前に?

いいえ、前のPHPヘッダーを最初に送信しません。ヘッダーは送信されますか、送信されません(1つのバッチとして完全に)PHPで送信されます。デフォルトでは headerドキュメント 呼び出しは、同じ名前の以前のヘッダーを置き換えます(2番目のパラメーターで異なるものを指定しない限り)。

注:PHPがヘッダーを収集しない場合、ヘッダーを置き換えることはできません。

以前に送信されていないため、スニファープログラムでは検出できません。

はい、ヘッダーはPHPによって収集され、「実際の」出力が開始された瞬間に送信されます(HTTP応答本文)。

参照してください headers_sentドキュメント

1
hakre