質問

私は現在取り組んでいるプロジェクト用に REST API の構築を開始しており、RoR を使用して API を構築する最適な方法について少し調査することにしました。デフォルトでは、モデルは世界中に公開されており、URL の末尾に「.xml」を付けて適切なパラメーターを渡すだけで、URL 経由で呼び出すことができることがすぐにわかりました。

そこで次の質問が来ました。不正な変更を防ぐためにアプリを保護するにはどうすればよいですか?いくつかの調査を行ったところ、次のことについて話している記事がいくつか見つかりました。 attr_accessible そして attr_protected そしてそれらをどのように使用できるか。これらについて話している特定の URL は 2007 年 5 月に投稿されたものでした (ここ).

Ruby に関するすべてのことと同様に、それ以来物事は進化していると確信しています。そこで私の質問は、これが RoR 内で REST API を保護する最善の方法でしょうか?

そうでない場合、「新しいプロジェクト」または「既存のプロジェクト」のシナリオで何を提案しますか?

役に立ちましたか?

解決

APIリクエストを認証するためのスキームはいくつかあり、restful_authenticationやacts_as_authenticatedなどのプラグインによって提供される通常の認証とは異なります。最も重要なことは、クライアントがセッションを維持しないため、ログインの概念がないことです。

HTTP認証

基本HTTP認証を使用できます。このため、APIクライアントは通常のユーザー名とパスワードを使用し、次のようにURLに入力します。

http://myusername:mypass@www.someapp.com/

restful_authenticationはこれをすぐにサポートするので、誰かがAPIまたはブラウザ経由でアプリを使用しているかどうかを無視できます。

ここでの欠点の1つは、すべてのリクエストでユーザー名とパスワードを平文で入力するようユーザーに求めていることです。 SSLを介して行うことで、これを安全に行うことができます。

しかし、実際にこれを使用するAPIを見たことはないと思います。特に現在の認証方式ですぐにサポートされているので、私にはまともなアイデアのように思えます。そのため、問題が何であるかわかりません。

APIキー

API認証を有効にするもう1つの簡単な方法は、APIキーを使用することです。基本的には、リモートサービスのユーザー名です。誰かがあなたのAPIを使用するためにサインアップするとき、あなたは彼らにAPIキーを与えます。これは、リクエストごとに渡す必要があります。

ここでの欠点は、誰かが他の人のAPIキーを取得した場合、そのユーザーとしてリクエストを行うことができることです。すべてのAPIリクエストでHTTPS(SSL)を使用することで、このリスクをいくらか相殺できると思います。

別の欠点は、ユーザーがどこにいても同じ認証資格情報(APIキー)を使用することです。 APIクライアントへのアクセスを取り消す場合、唯一のオプションはAPIキーを変更することです。これにより、他のすべてのクライアントも無効になります。これは、ユーザーが複数のAPIキーを生成できるようにすることで軽減できます。

APIキー+秘密キーの署名

非推奨(並べ替え)-下記のOAuthを参照

非常に複雑なのは、秘密鍵でリクエストに署名することです。これがAmazon Web Services(S3、EC2など)が行うことです。基本的に、ユーザーに2つのキーを与えます。APIキー(ユーザー名)とシークレットキー(パスワード)です。 APIキーはリクエストごとに送信されますが、シークレットキーは送信されません。代わりに、通常は別のパラメーターを追加することにより、各リクエストに署名するために使用されます。

IIRC、Amazonはリクエストにすべてのパラメーターを取得し、パラメーター名で並べ替えることでこれを実現します。次に、この文字列は、ユーザーの秘密キーをハッシュキーとして使用してハッシュされます。この新しい値は、送信前に新しいパラメーターとしてリクエストに追加されます。 Amazon側では、彼らは同じことをしています。すべてのパラメーター(署名を除く)を受け取り、順序付けし、秘密鍵を使用してハッシュ化します。これが署名に一致する場合、リクエストは正当であることがわかります。

ここでの欠点は複雑さです。このスキームを正しく機能させることは、API開発者とクライアントの両方にとって苦痛です。物事がうまくいかないクライアント開発者からの多くのサポート呼び出しと怒っているメールを期待してください。

OAuth

キー+シークレット署名に関する複雑な問題のいくつかに対処するために、 OAuth という標準が登場しました。中心となるOAuthはキー+シークレット署名のフレーバーですが、その多くは標準化されており、多くの言語のライブラリに含まれています

一般に、独自のキー/署名システムを作成するよりも、APIプロデューサーとコンシューマーの両方でOAuthを使用する方がはるかに簡単です。

OAuthは本質的にアクセスをセグメント化し、各APIコンシューマーに異なるアクセス資格情報を提供します。これにより、ユーザーは他の消費アプリケーションに影響を与えることなく、アクセスを選択的に取り消すことができます。

Ruby専用の

他のヒント

  

どのようにしてアプリを保護し、   不正な変更?

attr_accessible attr_protected は、どちらもActiveRecordモデルで一括割り当てを実行する機能を制御するのに役立ちます。フォームインジェクション攻撃を防ぐために、attr_protectedを必ず使用する必要があります。 attr_protectedを使用するか、ハックします

また、誰かがRailsアプリのコントローラーにアクセスできないようにするには、ほぼ確実に何らかの種類のユーザー認証システムが必要になり、コントローラーに before_filter を配置します要求されたコントローラーアクションの実行を許可する前に、許可されたユーザーが要求を行っていることを確認します。

トンについては、 Ruby on Railsセキュリティガイド(Railsドキュメントプロジェクトの一部)を参照してください。より役立つ情報。

Railsアプリケーション用のREST APIも構築しているため、現時点で似たような質問に直面しています。

ユーザーが編集できる属性のみがattr_accessibleでマークされていることを確認することをお勧めします。これにより、update_attributesを使用して割り当てることができる属性のホワイトリストが設定されます。

私がすることは次のようなものです:

   class Model < ActiveRecord::Base  
       attr_accessible nil  
   end

すべてのモデルはそれを継承しているため、一括割り当てを可能にするフィールドにはattr_accessibleを定義する必要があります。個人的には、この動作をデフォルトで有効にする方法があればいいのにと思います(あるかもしれませんが、それについては知りません)。

REST apiを使用するだけでなく、通常のフォームポストを使用してプロパティを一括で割り当てることができることを知っているだけです。

多くのものを自分で構築する手間を省くもう 1 つのアプローチは、次のようなものを使用することです。 http://www.3scale.net/ キー、トークン、クォータなどを処理します。個人開発者向け。また、分析も行い、開発者ポータルも作成します。

Ruby/Rails プラグインがあります ルビーAPIプラグイン これは、トラフィックの到着時にポリシーに適用されます。これと組み合わせて使用​​できます。 o認証宝石. 。アプリの前に varnish をドロップし、varnish lib mod を使用することによっても使用できます。 ワニスAPIモジュール.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top