web-dev-qa-db-ja.com

CORSはXSSをどのように防止しますか?

私は最近 [〜#〜] cors [〜#〜] について学び、その目的は XSSを防ぐ であるという印象を得ました。 CORSでは、特定の headers が設定されていない限り、ブラウザーは異なるドメインへの要求をブロックします。

ただし、悪意のあるユーザーがJavaScriptをページに挿入してユーザーのCookieを盗み、自分が制御するURLに送信した場合、サーバー側に次のヘッダーを追加するだけで、要求が機能します。

Access-Control-Allow-Origin: *

では、CORSはどのようにXSSを防ぐのでしょうか。それともCORSの目的を誤解していて、XSS自体とは何の関係もないのですか?

59
Gigi

TL; DR:CORSはXSSをどのように防止しますか? そうではありません。そうすることを意図していません。

CORSは、リソースホスト(HTTP経由でデータを利用可能にするサービス)が、そのデータにアクセスできるWebサイトを制限できるようにすることを目的としています。

例:トラフィックデータを表示するWebサイトをホストしており、WebサイトでAJAXリクエストを使用しています。IfSOP and CORSそこになければ、他のどのWebサイトもエンドポイントにAJAXを送信するだけでトラフィックデータを表示でき、誰でも簡単にデータを「盗む」ことができるため、ユーザーとお金を盗むことができます。

場合によっては、データの共有([〜#〜] c [〜#〜] ross [〜#〜] o [〜#〜] rigin [〜#〜] r [〜#〜] esource [〜#〜] s [〜#〜] haring)が意図されている、例えばFacebook APIのいいね!をWebページに表示するとき。上記の段落で説明した理由により、単にSOPを削除してそれを達成することは悪い考えです。したがって、CORSが導入されました。

JavaScriptの悪意のある部分をWebサイトに配置できる攻撃者も、正しいCORSヘッダーを送信するサーバーを設定できるため、CORSはXSSとは無関係です。 CORSは、悪意のあるJavaScriptがセッションIDとpermlogin Cookieを攻撃者に送り返すことを防ぐことはできません。

38
marstato

クロスサイトスクリプティング(XSS)は、攻撃者が定義したスクリプトコードを別のサイトのコンテキストで実行することです。 CORSはXSSを妨げません。実際、XSSとは無関係です。

代わりに、CORSは、Ajaxリクエスト(つまり、XMLHTTPRequest)に対する既存の制限を弱める方法を提供します。これにより、セキュリティ上の問題が発生しないことが期待されます。従来、XMLHTTPRequestは同じOrigin内での通信に制限されていました。つまり、一部の外部サイトにリクエストを送信することはできませんでした。この制限は、攻撃者がユーザーがログインしているサイトからデータを読み取ることができるため、攻撃者がクロスサイトリクエストを実行してリクエストの結果を取得できないようにするために行われました(セッションと他のCookieがそれぞれ送信されるため)サイトへのリクエスト)。

CORSでは、この制限が部分的に削除されています。 XMLHTTPRequestを別のサイトに送信できるようになりましたが、リモートサイトがアクセスを許可するCORSヘッダーを明示的に追加した場合、結果はアプリケーション内でのみ読み取ることができます。ただし、これもリモートサイトでスクリプトを実行していないため、XSSとは無関係です。

16
Steffen Ullrich

XSSとCORSが直接関連していないという他の回答は正解です(ただし、CORSは脆弱なサイトへのXSSの影響を制限するのに役立ちます)。

基本的にCORSは、バックエンドが他のサイトのjsから保護されている間、ブラウザーに入力されたcookieと資格情報を使用して、WebサイトjsフロントエンドコードがWebサイトバックエンドにアクセスできるようにし、クライアントブラウザーにアクセスを要求します(ユーザーが取得した資格情報を使用)。

これはControl-Allow-Credentials: trueが設定されています(これにより、ブラウザーがCookieおよびbasic/gssapi/napi authを送信できるようになります)。 CORSがこのオプションなしでどのように役立つかはまだわかりません。私の質問を参照してください " APIアプリでOriginを制限する必要がありますか? "

2
akostadinov

CORSは何も保護しません、SOP(Same Origin Policy)は代わりに何かを保護します。SOPターゲットドメインとブラウザユーザーを保護します。

実際、CORSは、SOP=の既存の制限を緩和し、Webサイト開発者が他のオリジンの共有データを使用できるようにします。

2
nowheretoseek

CORSとXSSは関連していますが、直接には関連していません。それを説明する最良の方法は例です:3つのサーバー(your_bank.com、api.your_bank.com、badguy.com *)と1つのクライアント(ブラウザー)を検討します。

  1. Your_bank.comにログインしています(ブラウザーには認証Cookieが保持されています)。
  2. Your_bank.comは、さらに多くのCookieを使用してAJAXリクエストをapi.your_bank.comに送信することでトランザクションを実行します(ブラウザに保持されます)。通常、ブラウザのSOPはブロックしますこのリクエストですが、代わりにCORS(api.your_bank.comによって付与)が許可します。
  3. Badguy.comで光沢のあるものを見つけ、そのページにアクセスします。
  4. Badguy.comは、ブラウザに保持されているそのドメインのCookieを使用してapi.your_bank.comにAJAX=リクエストを送信することにより、トランザクションを試みます。

ステップ4では、ブラウザー(侵害されていない)がapi.your_bank.comに送信された「Origin」ヘッダーを所有しています。 CORSが正しく構成されている場合、このステップはブロックされます。お使いのブラウザは、Cookieとリクエストヘッダーの所有者であり、他のサイトへのアクセスをゲートキーピングしています。

* badguy.comサイトは合法である可能性がありますが、XSSの問題があります。

0
Daniel