web-dev-qa-db-ja.com

モバイルアプリでのCORSセキュリティ

CORS制限を使用してAPIサーバーのセキュリティを維持する必要があります。

Access-Control-Allow-Origin : http://myonlinesite.com

しかし、モバイルアプリ(Android + iO)でこのAPIにアクセスできるようにする必要もあります。

私が見つけたすべての解決策は、すべてのOriginを許可するように言っています:*、しかしこれはAPIにとって大きなセキュリティ障害になります。

WebViewがローカルファイルを提供し、したがって送信するCordovaでアプリを構築しています:Origin: null、すべてのhttp(s)要求に対して。許可されたOriginにnullを追加することを考えています。 APIを取得しようとする他のすべてのWebサイトをブロックするため、より優れていますが、モバイルアプリはそれを取得できます...

これにもっと面白い解決策はありますか?

ありがとうございました!

39

したがって、許可されたOriginにnullを追加することを考えています。 APIを取得しようとする他のすべてのWebサイトをブロックするため、より優れていますが、モバイルアプリはそれを取得できます...

それを行うと、anynon-http/https Originから実行されるJavaScriptコードからのリクエストを許可します。これには、 file:// あるいは data: URL。

したがって、「セキュリティ」の理由で制限的なCORSポリシーを使用している場合は、Access-Control-Allow-Origin: nullヘッダーは、かなり悪い考えのように聞こえます。


CORS制限を使用してAPIサーバーのセキュリティを維持する必要があります。見つかったすべてのソリューションは、すべてのOriginを許可するように言っています:*、しかしこれはAPIにとって大きなセキュリティ障害になります。

セキュリティの障害だと判断した理由や、CORSポリシーを制限する必要がある理由については説明しません。ただし、(1)Webサーバーがイントラネットまたは他の種類のファイアウォールの背後で実行されており、(2)リソースへのアクセスがIP認証によってのみ制限されている場合を除き、制限付きCORSポリシーを使用しても何も得られません。 仕様を引用

基本的な安全なCORSプロトコルのセットアップ

IP認証またはファイアウォール(残念ながら比較的一般的)によってデータが保護されているリソースの場合、CORSプロトコルの使用は安全ではありません。 (これが、CORSプロトコルを発明しなければならなかった理由です。)

ただし、それ以外の場合は、次のヘッダーを使用しても安全です。

Access-Control-Allow-Origin: *

リソースがCookieまたはHTTP認証に基づいて追加情報を公開する場合でも、上記のヘッダーを使用しても明らかになりません。 XMLHttpRequestcurlと既に共有されているように、wgetなどのAPIとリソースを共有します。

したがって、言い換えると、curlおよびwgetを使用してWebに接続されたランダムなデバイスからリソースにアクセスできない場合、前述のヘッダーは含まれません。ただし、アクセスできる場合は、アクセスしても問題ありません。

21
sideshowbarker

Sideshowbarkerの回答で指摘したように、Access-Control-Allow-Origin: nullアプリをブラウザコンテキストで開くことができる場合、安全とは見なされません。ただし、専用のWebビューで実行されているアプリのセキュリティリスクはありません。

Same Origin Policy(CORSが拡張)は、特定の種類の脅威のために設計されています。ブラウザで実行される外部ドメインからのスクリプト、認証Cookieを含むサーバーへのリクエストの送信。ただし、専用のWKWebViewでアプリを実行している場合、Cookieを使用してサーバーにリクエストを送信できる外部スクリプトはありません。