2017-09-26 17 views
0

私はBreezeJSを使用しており、データの保存方法に関する質問があります。ここに私のコードは、ユーザーのために、それはやや不可能、私が最初にaccess_tokenはuser_idのから抽出したデータを取得し、where句でこれを含めるためにすべての私のクエリを制限する発信者の能力へのアクセスを制限するにはBreezeJS SaveChanges()セキュリティ上の問題

[Authorize] 
    /* 
    * I want to point out the security hole here. Any Authorized user is able to pass to this method 
    * a saveBundle which will be saved to the DB. This saveBundle can contain anything, for any user, 
    * or any table. 
    * 
    * This cannot be stopped at the client level as this method can be called from Postman, curl, or whatever. 
    * 
    * The only way I can see to subvert this attack would be to examine the saveBundle and verify 
    * no data is being impacted that is not owned or related directly to the calling user. 
    * 
    * Brute force could be applied here because SaveResult contains Errors and impacted Entities. 
    * 
    */ 

    [HttpPost] 
    public SaveResult SaveChanges(JObject saveBundle) 
    { 
     return _efContext.SaveChanges(saveBundle); 
    } 

コメント別のユーザーデータを取得します。

しかし、有効なaccess_tokenを持っている悪意のあるユーザーが、インクリメンタルなオブジェクトIDを持つブルートフォースループでSaveChanges()を呼び出すのを止めることはありません。

私はこれをオフにしていますか?たぶん私は何かが欠けているでしょう。

ありがとうございました。クライアントがSaveChangesメソッドに渡す

マイク

+0

breezeについて詳しくはありませんが、適切なアクセス制御を実装しているように思えます。オブジェクトIDの生成には暗号のランダム性を使用することをお勧めしますが、実際には適切なアクセス制御を実装することには二次的です。 SaveChanges()に関しては、ユーザーが行うことができる保存操作の数を制限することができます。そうしなければ、DBを迷惑メールで埋めることができます。 – TheGreatContini

答えて

2

JObject saveBundleは使い不透明とハードです。 Breeze ContextProviderはエンティティのマップに変換し、BeforeSaveEntitiesメソッドに渡します。あなたのBeforeSaveEntitiesまたはデリゲートメソッドで

var cp = new MyContextProvider(); 
    cp.BeforeSaveEntitiesDelegate += MySaveValidator; 

、あなたはエンティティを保存することができるかどうかをチェックします:BeforeSaveEntitiesはあなたのContextProviderサブクラスに実装し、またはあなたがContextProviderに接続し、デリゲート、例えば方法であります現在のユーザーによってあなたが救われるべきではないエンティティを見つけた場合は、変更セットからそれを削除するか、エラーをスローし、保存中止することができ、次のいずれか

protected override Dictionary<Type, List<EntityInfo>> BeforeSaveEntities(
       Dictionary<Type, List<EntityInfo>> saveMap) 
{ 
    var user = GetCurrentUser(); 
    var entityErrors = new List<EFEntityError>(); 
    foreach (Type type in saveMap.Keys) 
    { 
    foreach (EntityInfo entityInfo in saveMap[type]) 
    { 
     if (!UserCanSave(entityInfo, user)) 
     { 
     throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Forbidden) 
      { ReasonPhrase = "Not authorized to make these changes" }); 
     } 
    } 
    } 
    return saveMap; 
} 

あなたはユーザが許可すべきかどうかを判断する必要があります。特定のエンティティを保存します。これは、ユーザの役割および/または他の何らかの属性に基づくことができる。 Salesロールのユーザーは、自分のSalesRegionに属するClientレコードのみを保存できます。

+0

ありがとうございます!これはまさに私が知る必要があったものです。私は助けに感謝します! – Mike

関連する問題