3

最近、CitiGroupハッキング事件に関する興味深い記事を読みました http://www.nytimes.com/2011/06/14/technology/14security.html?_r=2&pagewanted=1&ref=technology

これにより、データベースに100,000行の機密性の高い従業員データのテーブルがあると思いました。テーブルには、ID列であるIdと呼ばれる主キーがあります。

従業員はWebポータルにログインでき、彼の詳細はRESTful URL({Controller} / {Action} / {Id})を介して取得されます(例:/ Employee / Details / 31)。

では、任意のパラメーター(Id = 32など)を{Id}パラメーターに置き換えて、従業員#32の詳細を取得するのをやめるにはどうすればよいですか?これはCitiGroupで起こったことですか?

これをどのように防ぎますか?つまり、ユーザーがWebポータルですでに認証されているが、他のユーザーのレコードを表示する権限がない場合はどうでしょうか。IDに加えて、顧客用に他の特定の「トークン」を使用する必要がありますか?

4

3 に答える 3

3

これは、まったく同じ状況で行ったことです。最初に、オブジェクトの拡張を宣言しました。

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
       }

    }
}

そして、コントローラーで:

public ActionResult Details(id)
{
    var item = repo.GetItem(id);
    if(!item.Editable())
    {
         return View("InvalidURL");
    }

    ...

}
于 2011-06-15T16:42:50.073 に答える
0

ASP.NETの役割とメンバーシップAPIを利用することをお勧めします。すでにそれを行っている場合、開始するために必要なのは、コントローラーにIsUserInRoleチェックマークを付けることだけです。ロールクラスの詳細については、次を参照してください。

MSDNロールクラス

于 2011-06-15T16:40:57.527 に答える
0

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

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

于 2011-06-15T17:04:14.033 に答える