web-dev-qa-db-ja.com

公的にアクセス可能なセキュリティ保護REST api

JavaScriptで、バックエンドRESTサービスと通信するパブリックシングルページアプリを作成しています。RESTサービスにアクセスできるのはシングルページアプリからのみであることです。

これは公開ウェブサイトであるため、ユーザーが認証の詳細を入力することはできません。 JSに保存されているシークレットは誰でも判読できるため、通常の認証メカニズムも機能しません。

RESTサービスは基本的に公開する必要があるため、セキュリティで保護することは不可能だと思いますが、誰かがスクリプトを作成してアプリケーションを複製するのを防ぐ方法を誰かが知っているかどうか疑問に思いましたREST api。

24
Kenneth

最初に頭に浮かぶのは、セッションを使用するか、ページで何かを設定して着信接続のIPをログに記録し、REST APIが最近メインにアクセスしたIPに応答することだけを許可することですこれはすべてのケースを防ぐわけではありませんが、REST APIを使用するには、少なくとも定期的にメインサイトにアクセスしている必要があります。

基本的に、ユーザーが認証を要求されない場合、画面リッパーがサイトからデータを効果的にプルするのを妨げるものは何もありません。 REST APIによってビジネスルールを適用する必要があるため、REST APIは実質的にWebサイトであり、それを使用するページは単に表示。

6
AJ Henderson

これがネイティブアプリの場合、以下を試すことができます。

  1. アクセスキーをApp Bundleに保存します。アプリの所有者(自分)以外はこれを保持できません。
  2. ヘッダーにアクセスキーが設定されたリクエストのみが成功するようにAPIを変更します。
  3. HTTPSを使用して、暗号化されたアクセスキーを誰も読み取れないようにします。

HTTPSを使用しない場合でも、ヘッダーに何かを入れてアクセスキーを手動でハッシュすることができます(サーバーとアプリのロジックだけがその方法を知っています)。これにより、真ん中の人がアプリのふりをすることができなくなります。

これが純粋なWebアプリの場合

最初に、純粋なWebアプリをネイティブアプリ(別名ハイブリッドアプリ)内にラップして、アプリ内に秘密鍵をバンドルすることで、上記の保護を実現できるようにすることをお勧めします。内部に単一のWebビューを持つネイティブアプリを開発するのに、それほどコストはかかりません。

ただし、それが不可能な場合は、アプリを純粋なWebアプリのままにします-ここに潜在的なオプションがあります、

  1. サーバーがWebアプリを提供するときに、アクセスキーを指定します。
  2. WebアプリがAPI呼び出しを行うとき、ハッシュされたバージョンのアクセスキーを提供する必要があります。
  3. Webアプリのハッシュ方法は、縮小化されたコードと難読化されたコードに実装されているロジックによって異なります。
  4. 次に、バックエンドAPIは、格納されているアクセスキーに同じ非表示ロジックを適用してハッシュを検証し、ハッシュを計算して一致するかどうかを確認します。
  5. 非表示のロジックとアクセスキーを必要な頻度で変更して、誰かが正しいハッシュを取得する可能性を減らすことができます。

もちろん、これは完全なものではありませんが、ご存じのとおり、完全なセキュリティはありません。おそらく、目的を達成します(そして、うまくいけば法案に適合します)。ハイブリッドを利用する方が費用対効果は高いですが。

9
Daniel

これは役立つかもしれません。あなたがあなたの残りのサービスを安全にすることができる多くのthignsがあります。 1つはCORSで、PUT/Deleteを使用します。これらのヘッダーはクロスドメインで設定できないためです。 http://www.nsa.gov/ia/_files/support/guidelines_implementation_rest.pdf

0
arcaneak