CORS (Cross-Origin Resource Sharing)
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicros...
-戻る
--[[クロス ドメイン接続]]
--[[HTTPヘッダ]]
* 目次 [#cd946db6]
#contents
*概要 [#oe684c04]
*詳細 [#o1070ea8]
**HTTPヘッダ [#rc36f13f]
-Request
--Origin~
源泉を表すURL。
-Response
--Cross-Origin-Resource-Policy~
<script> や <img> などの要素を使用して発行された~
他のオリジンからのリクエストに対する保護を事前に通知する。
--Timing-Allow-Origin~
Resource Timing APIを許可するオリジン
--X-Permitted-Cross-Domain-Policies~
アドビ製品によるページのレンダリングを許可
-Access-Control系
--Request
---Access-Control-Request-Headers
---Access-Control-Request-Method
---Access-Control-Expose-Headers
--Response
---Access-Control-Allow-Origin
---Access-Control-Allow-Credentials
---Access-Control-Allow-Headers
---Access-Control-Allow-Methods
---Access-Control-Max-Age
**同一源泉ポリシー [#y3501755]
先ず、同一源泉ポリシーと言う(同一オリジンポリシーとも呼...
-コンテンツがブラウザに来る源泉(origin)に基づいて整理し...
-以下の3つを一組としてすべて一致するとき[[同一の源泉(ori...
--URLスキーム
--ホスト(IPやFQDN)
--ポート番号
-厳密には異なるが[[クロスサイト、クロスドメイン>#lee5a245...
***セイムサイト(SameSite) [#i22f75b6]
-同一生成元(Same-Origin)とも言う。
-セイムサイト(SameSite)では、
--Same-Origin Policyで通信が可能。
--また、[[CookieのSameSite属性>SameSite属性の件]]などで利...
***クロスサイト、クロスドメイン [#lee5a245]
CORSは、クロスサイト、クロスドメイン接続専用に用意された...
-ブラウザとサーバ間で、約束された Request / Response を使...
そのドメインからのクロス ドメインの呼び出しを許可するか確...
-サーバが許可していれば XMLHttpRequest を使用したクロス ...
このように、ブラウザ・サーバの双方が CORS に対応している...
**使い方 [#bfd484fe]
***サーバーでポリシ設定 [#cd9a5772]
-フレームワーク次第だが、基本的に、閉じられているので、空...
-[[ブラウザ側で問題>#rfacb72b]]が出るので、Access-Control...
-ASP.NETの場合は、[[コチラ>#n5f10315]]を参考にして設定す...
***ブラウザのサポートを確認 [#rfacb72b]
-jQueryなど、ブラウザ上のライブラリは基本にCORSをサポート...
-ブラウザによってサポート状況が異なり動作が変わる。
--例えば、fetchで以下の様なエラーが出る。
Access to fetch at 'http://localhost:8888/...' from orig...
No 'Access-Control-Allow-Origin' header is present on th...
If an opaque response serves your needs, set the request...
--たぶん、下記もコレと同じような話だと思われる。~
https://github.com/OpenTouryoProject/FrontendTemplates/is...
-参考
--JavaScript - CORSでJSからAPIを叩けない|teratail~
https://teratail.com/questions/144992
***使いどころ [#qf9a9950]
-基本的に、CORSは閉じられているので、空ける。
-特定サイトのみ許可する制御を加える。
--対象:特定GUI(Public Client)にのみアクセスを許可する。
--対象外:不特定多数のClientに公開しているWebAPI
**ポイント [#q20c0e7c]
***Preflight request [#p9ff6462]
CORSプロトコルが理解されているかどうかを確認する CORSリク...
-CORSリクエストが受け入れられるかどうかを事前にチェックを...
-ある一定条件のリクエストを投げる際には事前に発生する。~
(代表的なものに、POST かつ application/json の例がある。)
-その場合、サーバが以下を適切にレスポンスするように構成す...
|#|Header|説明|h
|1|Access-Control-Allow-Origin|許可されるオリジンの一覧|
|2|Access-Control-Allow-Method|許可されるメソッドの一覧|
|3|Access-Control-Allow-Headers|許可されるヘッダの一覧|
|4|Access-Control-Max-Age|プリフライト情報のキャッシュを...
-シーケンス
--サイトAにScriptを含むコンテンツを要求
--上記のレスポンス
--上記で得たコンテンツからサイトBに「Preflight request」
OPTIONS /test HTTP/1.1
Origin: http://site-a.example.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-Custom-Header, Content...
--上記のレスポンス
Access-Control-Allow-Origin: http://site-a.example.com
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-Custom-Header, Content-T...
Access-Control-Max-Age: 86400
--上記で得たコンテンツからサイトBに「Main request」~
ブラウザは事前にOriginとAccess-Control-Allow-Originの一致...
POST /test HTTP/1.1
Content-Type: text/json
X-Custom-Header: custom-data
--上記のレスポンス
HTTP/1.1 200 OK
***curlでCORS設定を確認 [#ee1bd8d8]
-以下のように、~
curlで任意のOriginヘッダを指定してテストできる。~
※ 送信するOriginヘッダは、ブラウザでは捏造不可能。
-また、前述の[[Preflight request>#p9ff6462]]を~
テストすることも可能(下記の記事を参照のこと)。
>curl -H "Origin: http://example.com" --verbose http://l...
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8888 (#0)
> GET /api/values/get HTTP/1.1
> Host: localhost:8888
> User-Agent: curl/7.52.1
> Accept: */*
> Origin: http://example.com
>
< HTTP/1.1 200 OK
< Transfer-Encoding: chunked
< Content-Type: application/json; charset=utf-8
< Server: Microsoft-IIS/10.0
< X-Powered-By: ASP.NET
< Date: Thu, 05 Sep 2019 08:54:23 GMT
<
["value1","value2"]* Curl_http_done: called premature == 0
* Connection #0 to host localhost left intact
-参考
--How can you debug a CORS request with cURL? - Stack Ove...
https://stackoverflow.com/questions/12173990/how-can-you-...
--cURLを使用してCORSリクエストをデバッグするにはどうすれ...
https://codeday.me/jp/qa/20181207/26208.html
**差異 [#u264ce9f]
***[[クライアント毎>https://dotnetdevelopmentinfrastructu...
***ブラウザ毎 [#ye91963f]
なお、IE8, 9 ではサポート状況が違うため、~
ライブラリのプラグイン内で条件分岐しているもよう。
-ドメイン間要求 (XDR) の概要~
https://msdn.microsoft.com/ja-jp/library/dd573303.aspx
-XDomainRequest と XMLHttpRequest level 2 の 違い - galife~
https://garafu.blogspot.jp/2013/08/xdomainrequest-xmlhttp...
-CORS(Cross-Origin Resource Sharing)によるクロスドメイン...
http://dev.classmethod.jp/cloud/cors-cross-origin-resourc...
**危険な設定 [#c298bd55]
***Access-Control-Allow-Credentials: true [#j8e6762e]
-Access-Control-Allow-Credentials: trueが危ないレスポンス。
-攻撃者が 被害者の認証情報(Cookie)を任意のサイトに送信...
***Access-Control-Allow-Origin: * [#sd126b55]
-危ないように見えるが実は危なくない。
-[[Access-Control-Allow-Credentials: true>#j8e6762e]]は機...
-ただし、任意のサイトにリクエストを送信することはできる。
***Access-Control-Allow-Origin: null [#x4c8160a]
-実際の意味とは逆に「誰もいない」ではなく「全員」を意味す...
-[[Access-Control-Allow-Credentials: true>#j8e6762e]]が機...
***参考 [#rd1ad6ca]
-Exploiting CORS Misconfiguration Vulnerabilities on Web ...
https://medium.com/swlh/exploiting-cors-misconfiguration-...
*参考 [#ra2c5876]
-CORSでハマったことまとめ - pixiv inside~
http://inside.pixiv.net/entry/2014/12/16/181804
-ASP.NET Web API 2 CORS サポートについて - miso_soup3 Blog~
http://miso-soup3.hateblo.jp/entry/2013/10/08/015152
**Qiita [#iffd4d51]
-CORSまとめ~
https://qiita.com/tomoyukilabs/items/81698edd5812ff6acb34
-CORS関連、これだけ知っとけばまぁ大丈夫~
https://qiita.com/rooooomania/items/4d0f6275372f413765de
-CORS を分かってないから動くコード書いて理解する~
https://qiita.com/mochizukikotaro/items/6b72ad595db8a6b55...
**ASP.NET [#n5f10315]
ASP.NET Web API における設定は、下記を参照。
***Microsoft Docs [#iaf9c695]
-ASP.NET Web API 2 でクロスオリジン要求の有効化~
https://docs.microsoft.com/ja-jp/aspnet/web-api/overview/...
-ASP.NET Core でのクロスオリジン要求 (CORS) を有効にする~
https://docs.microsoft.com/ja-jp/aspnet/core/security/cors
***Stack Overflow [#f9d70b60]
-c# - How to enable CORS in ASP.NET Core~
https://stackoverflow.com/questions/31942037/how-to-enabl...
-c# - How to enable CORS in ASP.net Core WebAPI~
https://stackoverflow.com/questions/44379560/how-to-enabl...
----
Tags: [[:セキュリティ]], [[:プログラミング]], [[:IT国際標...
終了行:
「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicros...
-戻る
--[[クロス ドメイン接続]]
--[[HTTPヘッダ]]
* 目次 [#cd946db6]
#contents
*概要 [#oe684c04]
*詳細 [#o1070ea8]
**HTTPヘッダ [#rc36f13f]
-Request
--Origin~
源泉を表すURL。
-Response
--Cross-Origin-Resource-Policy~
<script> や <img> などの要素を使用して発行された~
他のオリジンからのリクエストに対する保護を事前に通知する。
--Timing-Allow-Origin~
Resource Timing APIを許可するオリジン
--X-Permitted-Cross-Domain-Policies~
アドビ製品によるページのレンダリングを許可
-Access-Control系
--Request
---Access-Control-Request-Headers
---Access-Control-Request-Method
---Access-Control-Expose-Headers
--Response
---Access-Control-Allow-Origin
---Access-Control-Allow-Credentials
---Access-Control-Allow-Headers
---Access-Control-Allow-Methods
---Access-Control-Max-Age
**同一源泉ポリシー [#y3501755]
先ず、同一源泉ポリシーと言う(同一オリジンポリシーとも呼...
-コンテンツがブラウザに来る源泉(origin)に基づいて整理し...
-以下の3つを一組としてすべて一致するとき[[同一の源泉(ori...
--URLスキーム
--ホスト(IPやFQDN)
--ポート番号
-厳密には異なるが[[クロスサイト、クロスドメイン>#lee5a245...
***セイムサイト(SameSite) [#i22f75b6]
-同一生成元(Same-Origin)とも言う。
-セイムサイト(SameSite)では、
--Same-Origin Policyで通信が可能。
--また、[[CookieのSameSite属性>SameSite属性の件]]などで利...
***クロスサイト、クロスドメイン [#lee5a245]
CORSは、クロスサイト、クロスドメイン接続専用に用意された...
-ブラウザとサーバ間で、約束された Request / Response を使...
そのドメインからのクロス ドメインの呼び出しを許可するか確...
-サーバが許可していれば XMLHttpRequest を使用したクロス ...
このように、ブラウザ・サーバの双方が CORS に対応している...
**使い方 [#bfd484fe]
***サーバーでポリシ設定 [#cd9a5772]
-フレームワーク次第だが、基本的に、閉じられているので、空...
-[[ブラウザ側で問題>#rfacb72b]]が出るので、Access-Control...
-ASP.NETの場合は、[[コチラ>#n5f10315]]を参考にして設定す...
***ブラウザのサポートを確認 [#rfacb72b]
-jQueryなど、ブラウザ上のライブラリは基本にCORSをサポート...
-ブラウザによってサポート状況が異なり動作が変わる。
--例えば、fetchで以下の様なエラーが出る。
Access to fetch at 'http://localhost:8888/...' from orig...
No 'Access-Control-Allow-Origin' header is present on th...
If an opaque response serves your needs, set the request...
--たぶん、下記もコレと同じような話だと思われる。~
https://github.com/OpenTouryoProject/FrontendTemplates/is...
-参考
--JavaScript - CORSでJSからAPIを叩けない|teratail~
https://teratail.com/questions/144992
***使いどころ [#qf9a9950]
-基本的に、CORSは閉じられているので、空ける。
-特定サイトのみ許可する制御を加える。
--対象:特定GUI(Public Client)にのみアクセスを許可する。
--対象外:不特定多数のClientに公開しているWebAPI
**ポイント [#q20c0e7c]
***Preflight request [#p9ff6462]
CORSプロトコルが理解されているかどうかを確認する CORSリク...
-CORSリクエストが受け入れられるかどうかを事前にチェックを...
-ある一定条件のリクエストを投げる際には事前に発生する。~
(代表的なものに、POST かつ application/json の例がある。)
-その場合、サーバが以下を適切にレスポンスするように構成す...
|#|Header|説明|h
|1|Access-Control-Allow-Origin|許可されるオリジンの一覧|
|2|Access-Control-Allow-Method|許可されるメソッドの一覧|
|3|Access-Control-Allow-Headers|許可されるヘッダの一覧|
|4|Access-Control-Max-Age|プリフライト情報のキャッシュを...
-シーケンス
--サイトAにScriptを含むコンテンツを要求
--上記のレスポンス
--上記で得たコンテンツからサイトBに「Preflight request」
OPTIONS /test HTTP/1.1
Origin: http://site-a.example.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-Custom-Header, Content...
--上記のレスポンス
Access-Control-Allow-Origin: http://site-a.example.com
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-Custom-Header, Content-T...
Access-Control-Max-Age: 86400
--上記で得たコンテンツからサイトBに「Main request」~
ブラウザは事前にOriginとAccess-Control-Allow-Originの一致...
POST /test HTTP/1.1
Content-Type: text/json
X-Custom-Header: custom-data
--上記のレスポンス
HTTP/1.1 200 OK
***curlでCORS設定を確認 [#ee1bd8d8]
-以下のように、~
curlで任意のOriginヘッダを指定してテストできる。~
※ 送信するOriginヘッダは、ブラウザでは捏造不可能。
-また、前述の[[Preflight request>#p9ff6462]]を~
テストすることも可能(下記の記事を参照のこと)。
>curl -H "Origin: http://example.com" --verbose http://l...
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8888 (#0)
> GET /api/values/get HTTP/1.1
> Host: localhost:8888
> User-Agent: curl/7.52.1
> Accept: */*
> Origin: http://example.com
>
< HTTP/1.1 200 OK
< Transfer-Encoding: chunked
< Content-Type: application/json; charset=utf-8
< Server: Microsoft-IIS/10.0
< X-Powered-By: ASP.NET
< Date: Thu, 05 Sep 2019 08:54:23 GMT
<
["value1","value2"]* Curl_http_done: called premature == 0
* Connection #0 to host localhost left intact
-参考
--How can you debug a CORS request with cURL? - Stack Ove...
https://stackoverflow.com/questions/12173990/how-can-you-...
--cURLを使用してCORSリクエストをデバッグするにはどうすれ...
https://codeday.me/jp/qa/20181207/26208.html
**差異 [#u264ce9f]
***[[クライアント毎>https://dotnetdevelopmentinfrastructu...
***ブラウザ毎 [#ye91963f]
なお、IE8, 9 ではサポート状況が違うため、~
ライブラリのプラグイン内で条件分岐しているもよう。
-ドメイン間要求 (XDR) の概要~
https://msdn.microsoft.com/ja-jp/library/dd573303.aspx
-XDomainRequest と XMLHttpRequest level 2 の 違い - galife~
https://garafu.blogspot.jp/2013/08/xdomainrequest-xmlhttp...
-CORS(Cross-Origin Resource Sharing)によるクロスドメイン...
http://dev.classmethod.jp/cloud/cors-cross-origin-resourc...
**危険な設定 [#c298bd55]
***Access-Control-Allow-Credentials: true [#j8e6762e]
-Access-Control-Allow-Credentials: trueが危ないレスポンス。
-攻撃者が 被害者の認証情報(Cookie)を任意のサイトに送信...
***Access-Control-Allow-Origin: * [#sd126b55]
-危ないように見えるが実は危なくない。
-[[Access-Control-Allow-Credentials: true>#j8e6762e]]は機...
-ただし、任意のサイトにリクエストを送信することはできる。
***Access-Control-Allow-Origin: null [#x4c8160a]
-実際の意味とは逆に「誰もいない」ではなく「全員」を意味す...
-[[Access-Control-Allow-Credentials: true>#j8e6762e]]が機...
***参考 [#rd1ad6ca]
-Exploiting CORS Misconfiguration Vulnerabilities on Web ...
https://medium.com/swlh/exploiting-cors-misconfiguration-...
*参考 [#ra2c5876]
-CORSでハマったことまとめ - pixiv inside~
http://inside.pixiv.net/entry/2014/12/16/181804
-ASP.NET Web API 2 CORS サポートについて - miso_soup3 Blog~
http://miso-soup3.hateblo.jp/entry/2013/10/08/015152
**Qiita [#iffd4d51]
-CORSまとめ~
https://qiita.com/tomoyukilabs/items/81698edd5812ff6acb34
-CORS関連、これだけ知っとけばまぁ大丈夫~
https://qiita.com/rooooomania/items/4d0f6275372f413765de
-CORS を分かってないから動くコード書いて理解する~
https://qiita.com/mochizukikotaro/items/6b72ad595db8a6b55...
**ASP.NET [#n5f10315]
ASP.NET Web API における設定は、下記を参照。
***Microsoft Docs [#iaf9c695]
-ASP.NET Web API 2 でクロスオリジン要求の有効化~
https://docs.microsoft.com/ja-jp/aspnet/web-api/overview/...
-ASP.NET Core でのクロスオリジン要求 (CORS) を有効にする~
https://docs.microsoft.com/ja-jp/aspnet/core/security/cors
***Stack Overflow [#f9d70b60]
-c# - How to enable CORS in ASP.NET Core~
https://stackoverflow.com/questions/31942037/how-to-enabl...
-c# - How to enable CORS in ASP.net Core WebAPI~
https://stackoverflow.com/questions/44379560/how-to-enabl...
----
Tags: [[:セキュリティ]], [[:プログラミング]], [[:IT国際標...
ページ名: