Same-Originポリシー(SOP)を使用すると、明示的に指示されない限り、ブラウザーは1つのOriginから別のOriginへのスクリプトの実行をブロックします。ただし、クロスサイトPOSTは引き続き許可され、CSRF攻撃の経路が作られます。防御は偽造防止トークンです。
しかし、ブラウザ開発者がPOSTを処理するとき、なぜ同じSOPの哲学に従わないのですか?
理論的には、あなたの提案は完全に合理的です。ブラウザーがOriginを横断するすべてのPOSTリクエストをデフォルトでブロックし、それらをロック解除するためにCORSポリシーを必要とする場合、そこにあるすべてのCSRF脆弱性の多くが魔法のように消えます。開発者として、 GETリクエストでサーバーの状態を変更しないようにする必要があります。トークンは必要ありません。
しかし、それは当時インターネットが構築された方法ではなく、現在それを変更する方法はありません。 Origin間のクロスの正当な使用法は数多くありますPOST=リクエスト。ブラウザがゲームの途中でルールを突然変更し、これを禁止した場合、古いルールに依存しているサイトは機能しなくなります。そのような既存のサイトの破壊は、私たちは可能な限り回避しようとしますが、残念ながら私たちは過去と共存しなければなりません。
それで、システムを微調整して何も壊すことなくよりよく機能させる方法はありますか? 1つの方法は、新しいHTTP動詞を導入することです。これをPESTと呼びましょう。これは、POSTのように機能しますが、すべてのPEST要求がプリフライトされ、CORSポリシーの対象となります。これはばかげた提案です。構成されていますが、それは標準を破ることなくどのように標準を開発できるかを示しています。
問題はリクエストメソッドではありません。CSRFはGETリクエストでも実行できます。問題は、代わりに(セッション)CookieやAuthorization
ヘッダーなどの認証情報がクロスサイトリクエストに自動的に含まれるため、CSRFが可能になることです。したがって、緩和策は、クロスサイト要求内でのこのような方法の使用を禁止することではなく、これらの認証情報を送信しないことです。
Cookieでは、 samesiteフラグ の提案があり、クロスサイトリクエスト内でCookieが送信されないようにします。残念ながら、フラグは現在 Chromeで利用可能 のみですが、2018年5月にv60を搭載したFirefoxで利用できるようになります。また、この制限がデフォルトで有効になっていて、デフォルトでは安全ではなく、安全性が低くなるように(CORSのように)明示的に変更されました。これだけでは、現在の動作に重大な変更が加えられ、おそらく多くの既存のアプリケーションが機能しなくなります。
私は一部アンダースに同意しません
しかし、それは当時インターネットが構築された方法ではなく、現在それを変更する方法はありません。
主要なブラウザの開発者は、インターネットを変更し、Web開発者を希望する方向に導く力を持っています。時代遅れのクロスサイトPOSTデータが主要な脅威と見なされた場合、データが存在する可能性があります。他の事柄にそのような進展の例がありますが、突然でも速くもありません:
閃光。以前はWebの将来と見なされていましたが、主要なブラウザーは将来サポートしないことを発表しており、Web開発者は調整しています。
HTTPSはブラウザーによって徐々に強制されており、プレーンなHTTPが安全でないことについて警告するための小さなステップがあります。最終的に、プレーンなHTTPがゆっくりと窒息死する世界が見られるかもしれません。
これを、互換性よりもセキュリティをより広く優先するように発展させたいと思います。当然のことながら、そのような大きな変更は近すぎることではなく、代わりにdiscouragingを最初に指定することによって行います。これを達成するためのパスは次のようになります。
POST
要求のSame-Origin Policyヘッダーの導入。POST
でセキュリティ上の問題の可能性があることを警告し始めます。プレーンHTTPでPOST
を推奨しないことは、クロスサイトPOST
を推奨しないことに非常に近く、どちらも標準に違反しています。これは、セキュリティを強化するための、下位互換性の意識的な喪失です。