web-dev-qa-db-ja.com

$ _SERVER ['HTTP_X_REQUESTED_WITH']はPHPかどうかに存在しますか?

ここでもStack Overflowに含まれるインターネット全体で、リクエストがAJAXであるかどうかを確認する良い方法は次のようにすることです:

if (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' ) {...}

ただし、 official PHP documentation$_SERVER['HTTP_X_REQUESTED_WITH']が表示されません

そして、私が次のことをしようとすると:

echo $_SERVER['HTTP_X_REQUESTED_WITH'];

何も出力されません。

私は何か間違っていますか? $_SERVER['HTTP_X_REQUESTED_WITH']が利用可能であれば使用できるようにしたいからです。

66
Hank

$_SERVERの変数は実際にはPHPの一部ではないため、PHPのドキュメントで見つけることができません。これらの変数は、Webサーバーによって準備されます。スクリプト言語。

私の知る限り、X-Requested-Withはほとんどの主要なフレームワークのAjax関数によって送信されますが、すべてではありません(たとえば、Dojoは2年前に追加しました: #5801 )。そのため、@ bobinceのコメントを考慮すると、リクエストがAJAXリクエストであるかどうかを判断するのに、一般的に100%信頼できる方法ではないと言うのは安全です。

唯一の100%安全な方法は、事前に定義されたフラグ(例:GET変数)をリクエストと共に送信し、受信ページがそのフラグの存在を確認することです。

60
Pekka 웃

そのようにcURLでヘッダーを簡単にスプーフィングできることを忘れないでください

curl_setopt($ch,CURLOPT_HTTPHEADER,array("X-Requested-With : XMLHttpRequest"));
27

$_SERVERで始まるキー[HTTP_は、HTTP要求ヘッダーから生成されます。この場合、X-Requested-Withヘッダー。

このヘッダーは、AJAXそこにあるすべてのライブラリからの標準化進行中です。

Phpのドキュメント自体には記載されていませんが、このヘッダーを設定する別のAJAXライブラリ。一般的なライブラリはこのヘッダーを送信します:jQuery、Mojo、Prototype、.. 。

通常、これらのライブラリは以下を使用してヘッダーを設定します

xhrobj.setRequestHeader("X-Requested-With", "XMLHttpRequest");
13
Jerome WAGNER

使用例のあるクイック関数です:

function isXmlHttpRequest()
{
    $header = isset($_SERVER['HTTP_X_REQUESTED_WITH']) ? $_SERVER['HTTP_X_REQUESTED_WITH'] : null;
    return ($header === 'XMLHttpRequest');
}

// example - checking our active call
if(!isXmlHttpRequest())
{
    echo 'Not an ajax request';
}
else
{
    echo 'is an ajax request';
}
5
tfont
echo $_SERVER['HTTP_X_REQUESTED_WITH'];

そのようなコードに何を期待しましたか? AJAXリクエストを使用せずに、ブラウザから直接実行していると仮定します。では、このヘッダーを設定するにはどうすればよいでしょうか?

さて、人生、宇宙、そしてすべての究極の質問に対する答え-HTTPスニファー!取得して、$ _ SERVER変数の出力を忘れてください。

Firebugには1つがありますが、Fiddler HTTPプロキシまたはLiveHTTPHeaders Mozillaプラグインを使用することもできます。リンクを作成するのは退屈ですが、簡単にグーグルで検索できます。

したがって、HTTPスニファーを使用すると、HTTPヘッダーを確実に確認できます。

サーバーへのすべてのHTTP要求は既に「直接」であるため、XHRを使用して「直接アクセス」を防ぐことはできません。

3

ブラウザのバグのせいにすることもできます-この質問とFirefoxの解決策をご覧ください

FirefoxはAjax要求のリダイレクト中にカスタムヘッダーを保持しません:ASP.NET MVCソリューション

IEにも キャッシュの問題 があり、リクエストメソッドの検出よりも深刻です。

とにかくキャッシュバスターを追加してキャッシュを回避する必要があるので、別のフラグを使用してajax呼び出しを指定しないでください-または、より良い http://ajax.mysite.com/endpoint/sevice? params

1
EGL 2-101
$headers = Apache_request_headers();
$is_ajax = (isset($headers['X-Requested-With']) && $headers['X-Requested-With'] == 'XMLHttpRequest');
1
revoke

HTTPリクエストがAJAXを介して本当に送信されるかどうかを確認する最良のソリューションは、SESSIONチェックを使用することです。get_sessionでsession_idを送信します。

0

ペッカに同意します。クライアントが実際にAJAXを使用してエンドポイントを呼び出しているかどうかを自動検出できる信頼できるネイティブメソッドは、フロントサイドとバックサイドの間にありません。

私自身の使用のために、クライアントがエンドポイントの1つを要求しているかどうかを確認する主な方法はいくつかあります。

  1. クロスドメインコンテキストではないときにHTTP_X_REQUESTED_WITHを使用できます。

  2. "X-requested-with"をチェックする代わりに、クロスドメインのアクセス許可を処理するために、$ _ SERVER ['HTTP_Origin'](AJAX request)から送信されます)をチェックしています。リクエストがAJAXリクエストであるかどうかを確認している主な理由は、特にクロスドメインのアクセス許可のためです。これを使用して、PHP Access-Control-Allow-Origin: '。$ _ SERVER [' HTTP_Origin ']); //この "HTTP_Origin"がホワイトリストに含まれている場合

  3. 私のAPIは、クライアントからデータ型(JSON、HTMLなど)を明示的に、またはGETまたはPOST var。)に期待しています。たとえば、$ _ REQUEST ['ajax ']は空または期待値と等しくありません。

0
FragBis