web-dev-qa-db-ja.com

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

JQueryと他のフレームワークは以下のヘッダを追加します。

X-Requested-With:XMLHttpRequest

なぜこれが必要なのでしょうか。サーバがAJAX要求を通常の要求とは異なる方法で扱いたいと思う理由は何ですか?

UPDATE:このヘッダーを使った実際の例が見つかりました。 https://core.spreedly.com/manual/支払い方法/ jsでの追加 。支払い処理業者がAJAXなしで要求された場合、支払い処理が完了すると元のウェブサイトにリダイレクトされます。 AJAXで要求された場合、リダイレクトは行われません。

183
Gili

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

クロスドメインは次のヘッダーのみ許可されます。

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

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

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

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

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

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

OWASPは、これをOriginおよびRefererチェックと組み合わせることを推奨します

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

ただし、すでに説明した理由により、Originのチェックには注意が必要です。

更新

CORS、CSRF、およびX-Requested-With here に関する詳細なブログ投稿を作成しました。

227
SilverlightFox

SilverlightFoxの答えを必ず読んでください。より重要な理由を強調しています。

その理由は主に、リクエストのソースを知っていれば、それを少しカスタマイズしたいと思うかもしれないということです。

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

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

これでwww.example.com/recipe_only/Apple_pieのようなデータ用の二次エンドポイントを書くことができますが、それを維持して他の人々と共有することはより困難です。

しかし、それが要求を出してからデータの一部だけを返すajax要求であることを検出する方が簡単です。そうすれば、ユーザーの帯域幅の無駄が少なくなり、サイトのレスポンスが向上します。

フレームワークは単にヘッダを追加するだけです。なぜなら、どのリクエストがajaxでどれがそうでないかを追跡するのが便利だからです。しかし、そのような技術を使用することは開発者に完全に依存しています。

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

21
EWit

いくつかのフレームワークはxhr要求を検出するためにこのヘッダを使用しています。 grails spring securityはこのヘッダを使用してxhrリクエストを識別し、レスポンスとしてjsonレスポンスまたはhtmlレスポンスを提供しています。

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

出典: http://grails-plugins.github.io/grails-spring-security-core/guide/helperClasses.html

7
Koray Güclü