X-Requested-Withヘッダーのポイントは何ですか?


224

jQueryおよびその他のフレームワークは、次のヘッダーを追加します。

X-Requested-With:XMLHttpRequest

なぜこれが必要なのですか?サーバーがAJAXリクエストを通常のリクエストとは異なる方法で処理したいのはなぜですか?

更新:私はこのヘッダーを使用して実際の例を見つけました:https : //core.spreedly.com/manual/payment-methods/adding-with-js。支払いプロセッサがAJAXなしで要求された場合、処理が完了すると元のWebサイトにリダイレクトされます。AJAXで要求された場合、リダイレクトは行われません。


7
「[AJAXなしでリクエストされた場合、元のWebサイトにリダイレクトされます。AJAXでリクエストされた場合、リダイレクトは行われません。」->それがまさにあなたがそれをしたいと思う理由です。:)
Robert Christian

回答:


257

セキュリティ上の理由としては、これがCSRF攻撃を防ぐことができます。これは、CORSを介したサーバーの同意なしに、このヘッダーをAJAX要求のクロスドメインに追加できないためです。

ドメイン間で許可されるヘッダーは次のとおりです。

  • 受け入れる
  • 受け入れ言語
  • コンテンツ言語
  • 最終イベントID
  • コンテンツタイプ

それ以外の場合は、CORSがサポートされているブラウザで「プリフライト」リクエストが発行されます。

CORSがないX-Requested-Withと、クロスドメインXHRリクエストに追加できません。

サーバーがこのヘッダーが存在することを確認している場合、リクエストは、JavaScriptを使用してユーザーに代わってリクエストを作成しようとした攻撃者のドメインから開始されたものではないことがわかります。これは、リクエストが通常のHTMLフォームからPOSTされていないことも確認します。トークンを使用しないとクロスドメインでないことを確認することは困難です。(ただし、サポートされているブラウザーでOriginヘッダーのチェックがオプションになる可能性がありますが、古いブラウザーは脆弱なままになります。)

新しいフラッシュバイパスが検出されました

リダイレクトステップがある場合、OSXのSafariで実行されているFlash がこのヘッダーを設定できるため、これをトークン組み合わせることができますます。Chromeでも動作するようですが、現在は修正されています。影響を受けるさまざまなバージョンを含む詳細はこちら

OWASPこれをOrigin and Refererチェックと組み合わせることをお勧めします:

この防御手法については、クロスサイトリクエストフォージェリに対する堅牢な防御のセクション4.3で具体的に説明されています。ただし、Flashを使用したこの防御策の迂回は、VameoのCSRFの欠陥を悪用するために、Mathias Karlssonによって、2008年から2015年にかけて文書化されています。ただし、Flash攻撃で​​はOriginヘッダーまたはRefererヘッダーを偽装することはできないため、両方をチェックすることで、このチェックの組み合わせによりFlashバイパスCSRF攻撃を防ぐことができると考えています。(注:この信念を誰かが確認または否定できる場合は、この記事を更新できるようにお知らせください)

ただし、すでに説明した理由により、Originのチェックは難しい場合があります。

更新

CORS、CSRF、およびX-Requested-With hereに関するブログ記事を詳しく説明しています


14
わかりません。攻撃者がリクエストを作成してX-Requested-Withヘッダーを追加することを妨げるのは何ですか?
グレッグ

13
@Greg:ブラウザー-クロスドメインを許可しません。
SilverlightFox

2
ああ、同じドメインにいる限り、CORS設定が必要ないことに気づきませんでした。考えてみると明らかです。よろしくお願いします!
グレッグ

10
@ vol7ron:彼らを止めるものは何もありませんが、リクエストに被害者のCookieが含まれず、リクエストを行う相手のオブジェクトを無効にします。CSRFが成功するためには、攻撃者はブラウザにリクエストにCookieを自動的に添付する必要があるため、ブラウザがなければCSRF攻撃はありません。
SilverlightFox

3
@ vol7ron:前者。CSRFは混乱した代理問題です。ブラウザーは混乱した代理であり、ユーザーが自分で行っていない要求に対してCookieを送信するように「騙され」ます。
SilverlightFox

25

SilverlightFoxの回答を必ずお読みください。それはより重要な理由を強調しています。

その理由のほとんどは、リクエストのソースがわかっている場合、それを少しカスタマイズしたい場合があるためです。

たとえば、たくさんのレシピがあるウェブサイトがあるとしましょう。そして、カスタムjQueryフレームワークを使用して、クリックしたリンクに基づいてレシピをコンテナーにスライドさせます。リンクはwww.example.com/recipe/apple_pie

これで通常は、ページ全体、ヘッダー、フッター、レシピコンテンツ、および広告が返されます。しかし、誰かがあなたのウェブサイトを閲覧している場合、それらのパーツのいくつかはすでにロードされています。したがって、AJAXを使用してユーザーが選択したレシピを取得できますが、時間と帯域幅を節約するためにヘッダー/フッター/広告をロードしません。

これで、次のようなデータのセカンダリエンドポイントを作成できます。 www.example.com/recipe_only/apple_pie、それを維持して他の人と共有することは困難です。

しかし、それがajaxリクエストであることを検出してリクエストを作成し、データの一部のみを返す方が簡単です。そうすることで、ユーザーが無駄にする帯域幅が減り、サイトの応答性が向上します。

フレームワークはヘッダーを追加するだけです。これは、どの要求がajaxであり、どの要求がajaxでないかを追跡するのに役立つ場合があるためです。しかし、そのようなテクニックを使用するかどうかは開発者に完全に依存しています。

実際には、Accept-Languageヘッダーに似ています。ブラウザがウェブサイトをリクエストできるので、URLに/ ru /などを挿入せずに、このウェブサイトのロシア語バージョンを見せてください。


30
うわー、それは恐ろしいメンテナンスの悪夢のように聞こえます。同じページの別の表現を返す場合は、Acceptヘッダーに別のcontent-typeを指定する必要があります。これにカスタムヘッダーを使用すると、間違った方法のように聞こえます。
ギリ

10

一部のフレームワークはこのヘッダーを使用してxhr要求を検出しています。たとえば、Grails Spring Securityはこのヘッダーを使用してxhr要求を識別し、json応答またはhtml応答のいずれかを応答として返します。

ほとんどのAjaxライブラリ(v2.1以降のプロトタイプ、JQuery、およびDojo)には、リクエストが通常のハイパーリンクまたはフォーム送信ボタンをクリックすることによってトリガーされるのではなく、XMLHttpRequestによって作成されたことを示すX-Requested-Withヘッダーが含まれています。

ソース:http : //grails-plugins.github.io/grails-spring-security-core/guide/helperClasses.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.