2011-06-15 15 views
3

私はシティグループハッキング事件 http://www.nytimes.com/2011/06/14/technology/14security.html?_r=2&pagewanted=1&ref=technologyMVC RESTful Urlsをハッキングから保護する方法は?

これは私が考えるようになった上で、最近、興味深い記事を読んで、私は100,000行と私のデータベース内の機密従業員データのテーブルを持っていると言います。このテーブルには、IDというプライマリキーがあります。これはID列です。

従業員はWebポータルにログインでき、その詳細はRESTfulなURL({コントローラ}/{アクション}/{Id})を介して取得されます。/Employee/Details/31

ここで、{Id}パラメータ(たとえばId = 32)と{ の従業員#32のパラメータの{Id}パラメータの置き換えを中止するにはどうすればよいですか。これはCitiGroupで何が起こったのですか?

どうしますか?つまり、ユーザーがWebポータルですでに認証されている場合 他のユーザーのレコードを表示する権限がありません。 Id以外にも のお客様に別の特定の「トークン」を使用する必要がありますか?

+0

私はカスタムメンバーシップAPIを実装しています。これは正常に動作します。つまり、EmployeeがFormsAuthenticationを使用してログインし、FormsAuthentication Ticket(Cookie)が作成されます。次に、コントローラとアクションに権限を与えるために、従業員がロール、IsAuthenticatedなどにあるかどうかを確認します。しかし、これは依然として、私が権限/従業員/詳細にアクセスするために承認され認証されているため、彼に属していないデータへのアクセスを妨げません。(推測された)EmployeeIdを置き換えることができますか? –

+0

また、誰かが自分のURLをスカイプ経由で他の人に送ることができるようにあなたのURLに使用するすべてのIDを暗号化して解読することができます – Omu

答えて

3

これは私が、まったく同じような状況のためにした最初の私はオブジェクトへの拡張を宣言したものです: あなたはクラスここでの役割についての詳細な情報を見つけることができますコントローラ内:

+0

こんにちはクリス、従業員が会社に属していると私は/会社/詳細/ 101を呼び出す会社の詳細を取得することができます、つまり、それは会社の詳細のためのRESTful URLです。この例では、UserIdを渡し、Userがデータベースレベルで取得している会社に所属しているかどうかを確認する必要がありますか? –

+0

+1これは私が取るアプローチと大体似ています。私のチェックオブジェクトは少し拡張されているので、管理者ロールユーザーは 'user'オブジェクトも表示/変更できます。 –

+0

個人的には私がur.CurrentUser()を実装しているので、ユーザーIDを渡す必要はありません。 – Chris

0

ASP.NETロールとメンバーシップAPIを使用することをお勧めします。もしあなたがすでにそれをしているのであれば、起動するために必要なことはコントローラにIsUserInRoleチェックを付けることです。

public static bool Editable(this EXPENSE_OBJ e) 
{ 
    if (e != null) 
    { 
     UserRepository ur = new UserRepository(); 

     if (ur.CurrentUser().UserId == e.UserId) //Check if the user owns the claim 
     { 
      return true; //User owns the claim 
     } 
     else 
     { 
      return false; //User does not own the claim 
     } 

    } 
} 

そして:

MSDN Roles Class

+0

こんにちはロバート、私はすでに自分自身を実装していますメンバーシップ&ロールAPIとこれは、つまり、私のアプリを正常に動作します。認証され、次に彼はアクションにアクセスする権限を与えられます。ただし、ユーザーはアクションを使用してデータベースから別のデータセットを取得します。彼のデータだけにアクセスする必要があります。それは理にかなっていますか? –

0

私は、ユーザーとエンティティのIDの間の関係を保持する多対多テーブルを使用します彼らは変更することができます。誰かがそれらのエンティティの1つを変更しようとするたびに、私は彼らがそれを行うことが許可されていることを確認するチェックを行います。また、エンティティが削除されるたびに、その多対多テーブルの関連するレコードを削除するエンティティを保持するトリガをテーブルに配置します。これは私のために非常にうまくいきました。

もう1つのことは、主キーにintの代わりにGuidを使用することです。これにより、人々は主キーを推測できなくなります。

関連する問題