質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.23%

対象外のオリジンからのアクセスを制限したい。

解決済

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 202

HelloWorld2

score 17

※ソースコードベースの質問ではなく、「あるべき論」、「方針」に関する質問です。初心者のため、そもそもの認識に誤りがあるかもしれませんが、ご指摘、ご鞭撻頂けると幸いです。

やりたいこと

  • 対象のWebサイトのHTML内に、JavaScriptのタグを埋め込み、そこから自作のAPIを実行し、ajaxのpost通信でデータを送信します。
  • apiは、AzureのFunctionsを用いてC#で作成します。(今回の質問にはあまり関係ありません)
  • apiを実行できるWebサイトを、特定のOriginに限定します。

現状

  • api側でCORSの設定を行い、JavaScript内のajax送信の際、「contentType」に「application/json」を設定することで、プリフライトリクエストを送り、対象外のOriginからのapiの実行を防ごうとしています。

問題点

  • ajaxで「contentType」の指定を外して実行された場合、プリフライトリクエストは送れず、対象外のOriginからのapi実行は防げない認識です。(レスポンスはされないが、実行はされる)
  • したがって、悪意のあるリクエストからapiを守るために、CORSの設定以外の対策が必要だと考えております。

質問内容

  • 特定のOrigin以外からのapi実行を防ぐためには、どうすれば良いのでしょうか・・・?

考えていること

  • 無知の私の考えでは、api側で対象のOriginをすべて保持し、api側のソースコード内で、HttpRequestのリクエストヘッダのOriginヘッダを取得し、対象のOriginに含まれるかどうかを判定し、trueの場合apiを実行する、という考えしか思い浮かびません。。。(そもそもOriginヘッダの書き換えできるなら、悪意のあるサイトは弾けませんが・・・)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

CORSとプリフライトって、通常は通信出来ないクロスドメインな通信を安全に許可するための仕組みであって、サーバ側のセキュリティに寄与するものでは無いです。

オリジン間リソース共有 (CORS)
https://developer.mozilla.org/ja/docs/Web/HTTP/CORS

Cross-Origin Resource Sharing (CORS) は、追加の HTTP ヘッダーを使って、あるオリジン (ドメイン) で動いているウェブアプリケーションが、異なるオリジンのサーバーのリソースにアクセスできるようにする仕組みです。

そのため、通常のHTTPリクエストに対する認証やアクセス制限と同様の方法でアクセス制限をかける必要があります。
(クロスドメインの場合、cookieの扱いは注意が必要ですが。)

無知の私の考えでは、api側で対象のOriginをすべて保持し、api側のソースコード内で、HttpRequestのリクエストヘッダのOriginヘッダを取得し、対象のOriginに含まれるかどうかを判定し、trueの場合apiを実行する、という考えしか思い浮かびません。。。(そもそもOriginヘッダの書き換えできるなら、悪意のあるサイトは弾けませんが・・・)

HTTPリクエストヘッダーはHTTPクライアントが生成するものであり、自由に捏造可能です。
特定のリファラーやUAからしかアクセス出来ないようなページを用意したとしても、
簡単に突破可能なのと同じで、悪意を持ったリクエストを防ぐ手段にはなりません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/16 10:43 編集

    ご回答ありがとうございます。
    > サーバ側のセキュリティに寄与するものでは無いです。
    さまざまなサイトで書かれておりますが、あまりイメージがわいてないです。というのも、サーバ側でCORSの設定をするため、ブラウザ側でどこら辺がセキュアなのか・・・?という印象です。ブラウザ側で設定するなら非常に納得がいくのですが。

    > 通常のHTTPリクエストに対する認証やアクセス制限と同様の方法でアクセス制限をかける必要があります。
    なるほど、そうなのですね。
    (通常の認証やアクセス制限について詳しくなく恐縮ですが)ログイン処理もない、不特定多数が閲覧するWebサイトからapiを実行する場合、apiへのアクセス制限をかけるのは難しいでしょうか?(「特定のオリジン」からの不特定多数からのアクセスを許可したいです)

    キャンセル

  • 2019/04/16 11:15

    > サーバ側のセキュリティに寄与するものでは無いです。
    さまざまなサイトで書かれておりますが、あまりイメージがわいてないです。というのも、サーバ側でCORSの設定をするため、ブラウザ側でどこら辺がセキュアなのか・・・?という印象です。ブラウザ側で設定するなら非常に納得がいくのですが。

    スタート地点の背景(ブラウザは原則としてXHR等でのクロスドメイン通信は出来ないが、JSONP等で抜け穴的&非安全に通信できてしまう)から調べてみるといいと思います。

    > 不特定多数が閲覧するWebサイトからapiを実行する場合、apiへのアクセス制限をかけるのは難しいでしょうか?

    オリジン=コンテンツの配信元=サーバなので、「特定のオリジンからの」というのは表現が若干ずれていると思いますが、
    「今、特定のサイトにアクセスしている人だけ」という条件であれば、
    そのサイトのサーバと何らかの方法でサーバ間通信させて
    - セッション情報を共有したり、
    - APIアクセストークンをHTML上に表示してそれを使わないとAPIアクセス出来ないようにしたり
    - OAuthなどで認証させたり
    といった仕組みが考えられます。

    通常のHTTPリクエストに対する認証やアクセス制限について1から説明するのは難しいので、まずは通常のwebアプリケーションの認証方法について調べてみてください。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる