2012-01-18 9 views
20

似たような質問がたくさんあることは知っていますが、ユーザーがコードにアクセスできるHTML/javascriptアプリケーションはありません。AJAXアプリケーションでプライベートREST APIを保護する方法

私はnodejsで書かれたプライベートREST APIを持っています。その目的は私のHTML5クライアントアプリ(ChromeアプリとAdobe Airアプリ)をサーバーすることだけです。したがって、APIキーはすべてのユーザーがjavascriptコードを見ることができるので、良い解決策ではありません。

私は自分のサーバーにアカウントを作成してリソースを消費することを避けたいと考えています。

これを実現する方法はありますか?

+2

回答があなたの質問を満たしているかどうかはわかりません。あなたが説明した問題にどのように接近したかを親切に伝えてください。未登録のユーザーに使用できるREST + AJAXベースのWebアプリケーションを構築しています。自分のように、私はボットからリソースを保護したい。 –

+0

誰もがソースを見たり、サーバーに送信されているデータを監視できるWebページから呼び出されている場合は、論理的にAPIを本当にプライベートにすることはできません。ボットを捕まえるにはCaptchaのような通常のテクニックがありますが、最終的には自動DDOS型攻撃の可能性に対処するためにバックエンドサポート(WAF、高速自動スケーリングなど)が必要です。できるだけ早く(DB接続などを行う前に)可能性の高いDDoS攻撃を検出する限り、最初にページをダウンロードしようとしているボットを処理することは変わりません。 –

答えて

15

特に、APIキーの要求元に制約が必要な場合は、APIキーが適切なソリューションです。元のWebリクエストが、プライベートドメインなどの承認されたソースからのものである場合にのみ、APIキーを受け入れるようにしてください。 Web要求が不正なドメインからのものである場合、その要求の処理を単に拒否することができます。

ハッシュベースのメッセージ認証コード(HMAC)などの特殊なエンコーディングスキームを使用することで、このメカニズムのセキュリティを向上させることができます。次のリソースは明らかにこのメカニズムを説明します

http://cloud.dzone.com/news/using-api-keys-effectively

+2

APIキーソリューションは、Google Maps、Flickr、Facebookなどの他の多くのAPIでも動作することが重要です。このトリックは実装に含まれています。 –

+0

ユーザーの所在を制御できません。公開アプリケーションです。 Googleマップ、FlickrなどはAPIキーを使用しますが、誰がキーを使用するか心配しているかどうかはわかりません。私はコピーしてGoogleマップのキー(試していない)を使用することができると思います。 – aartiles

+0

Google Maps APIは、生成されたすべてのAPIキーを特定のドメインクラス(つまり、mydomain.com)に結びつけているため、Google Maps APIキーを単純にコピーして別のドメインで使用することはできません。参照URL、およびAPIキーにエンコードされたその他の情報が含まれます。ここでも、典型的なコード化機構はHMACである。そうでなければAPIキーは役に立たないでしょう。 –

1

あなたが何をしたいのか、あなたのサーバが唯一のアプリからの着信接続を受け入れるだろうとあなたのアプリは、あなたのサーバーと通信するように、相互認証SSLを採用しています。

ここには、高度なアプローチがあります。自己署名入りのサーバーSSL証明書を作成し、Webサーバーに展開します。 Androidを使用している場合は、この目的でAndroid SDKに付属のkeytoolを使用できます。別のアプリプラットフォームを使用している場合、同様のツールも同様に存在します。次に、自己署名付きのクライアントを作成し、アプリケーション内にリソースとしてカスタムキーストアに配置します(keytoolはこれも生成します)。クライアント側のSSL認証を要求し、生成したクライアント証明書のみを受け入れるようにサーバーを構成します。そのクライアント側の証明書を使用して自分自身を識別し、その部分のサーバーにインストールしたサーバー側の証明書を1つだけ受け入れるようにクライアントを構成します。

アプリ以外の誰かがあなたのサーバーに接続しようとすると、サーバーはあなたのアプリに含まれているクライアント証明書を提示しない受信SSL接続を拒否するため、SSL接続は作成されません。

これは、ここで保証されているよりもはるかに長い答えです。私は段階的にこれを行うことをお勧めします。これは、Android上で自己署名入りのSSL証明書(他のモバイルプラットフォームでこれを行う方法に慣れていない)、つまりサーバー側とクライアント側の両方で対処する方法についてのWeb上のリソースです。私の本「Androidプラットフォームのアプリケーションセキュリティ」には完全なウォークスルーがあります(O'Reilly出版)。

+0

私のWebアプリケーションは純粋なjavascriptとHTMLではなく、アンドロイド – aartiles

+0

このアプローチはまだ動作します。あなたのアプリのウェブサーバーと、通信したいクライアントとの間で相互認証SSLを強制する。 – jeffsix

+0

標準のウェブブラウザではどうすればいいですか? Google Chromeと言うことができます。 – aartiles

関連する問題