1

私には、breeze/odata クエリがデータへのセキュリティ アクセスに重大なリスクをもたらすように思えます。たとえば、制限されたエンティティ (R) に関連する制限されていないエンティティ (U) があるとします。R をクエリするエンドポイントを公開せず、関連する R を含めずに U をクエリするようにクライアントを記述します。ただし、悪意のあるクライアントが関連する Rs を要求する可能性があります。

これを防ぐにはどうすればよいですか?

いくつかのアイデアがあります。しかし、私はそれらが機能するかどうかを言うことができるようにまだ実装できていません。それにもかかわらず、ここに私の考えがあります:

1) クエリが実行された後、結果がクライアントに送信される前に、結果の各エンティティを検査します。しかし、実行とクライアントへの送信の間に(コールバックなどを介して)チェックコードを挿入する方法がわかりません:(

2) スマートを POCO に追加して、ユーザー ロールに基づいて制限されたエンティティとプロパティをチェックします。たとえば、次の代わりに:

class MyThing{
  public string P {get;set;}
}

私は次のようなものを持っています:

private string _p;
public string P 
{ 
  get 
  { 
    if (UserRoles.HasAny("role-a","role-b"))
      return _p;
    return null; 
  }
  set { _p = value; }
}

POCOはばかげているはずなので、それは厄介なようです。POCO は、どこかからユーザー ロールを読み取ることができる必要があります。おそらく HTTP セッションです。それがどのように機能するかはよくわかりません。

次の質問/回答を読みましたが、役に立ちません: Breezejs と EF6 のロール ベースのセキュリティ、breeze.jsは セキュリティをどのように処理し、 ビジネス ロジックの公開を回避していますか、Breeze JS で承認を処理する方法は?

4

2 に答える 2

0

この SO 回答で説明されているように、 AllowedQueryOptionsを使用 して、クライアントが実行されないようにすることができます。$expand

もう 1 つの方法は、ODataQueryOptionsを WebAPI コントローラー メソッドのパラメーターとして使用することです。これにより、サーバー メソッドのクエリ述語の詳細が得られるため、WebAPI に自動的に適用させるのではなく、必要に応じて適用できます。これにより、クエリに基づいて展開するかどうかを指定できます。

この回答この回答を参照して、それがどのように機能するかを確認してください。

于 2016-09-16T00:57:47.023 に答える
0

私の質問を読んで、それについて考え、さらには回答までしてくれた人に感謝します。しかし、私にとっては何も提案されていませんでした。だから、私は自分でそれを理解しました。オプション #1 を実装して、いくつかの簡単なクラスをサブクラス化できます。EnableBreezeQueryAttribute をサブクラス化して、NewQueryHelper をオーバーライドして QueryHelper サブクラスを返すことができるようにします。次に、サービス メソッドで CustomEnableBreezeQueryAttribute を使用します。ValidateData メソッドは、エンティティ オブジェクトで呼び出されます。制限された情報が含まれている場合、メソッドが失敗する可能性があります。または、制限されている情報を空白にして、制限されていない情報が返されるようにすることもできます。

public class CustomEnableBreezeQueryAttribute : EnableBreezeQueryAttribute
{
    private class CustomQueryHelper : QueryHelper
    {
        public override IEnumerable PostExecuteQuery(IEnumerable queryResult)
        {
            queryResult = ValidateData(queryResult);
            return base.PostExecuteQuery(queryResult);
        }

        private IEnumerable ValidateData(IEnumerable queryResult)
        {
            //TODO: validate/modify data
        }
    }

    protected override QueryHelper NewQueryHelper()
    {
        return new CustomQueryHelper();
    }
}

これを行う方法を理解するのがどれほど難しいかに驚いています。そして、この時点でコードを挿入するのは簡単ではありません。やってはいけないことをしているのだろうか? それとも、これは本当に odata/breeze の機能の穴ですか? それとも、これが odata/breeze での処理方法ですか?

于 2016-09-16T20:26:04.100 に答える