私には、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 で承認を処理する方法は?