2012-01-25 20 views
1

2人のユーザーが同時にサービスシステムにログオンし、サービス一覧のgridviewを見ていると、問題が発生します。 user1がgridviewをフィルタリングする検索を実行し、user2が別のページをクリックした場合、user2はuser1が実行した検索結果を表示します。つまり、ある企業が他の企業のデータを見ることができます。ASP.NETおよびSQL Serverのセキュリティ問題

C#/ ASP.NET 3.5で開発されたASP.NETアプリケーションです。データはSQL 2000データベースに格納され、ストアドプロシージャに大きく依存してデータを更新、選択、および削除します。ユーザーが表示できるデータに制限されている複数のユーザータイプがあります。たとえば、その会社に関連するデータしか見ることのできない会社の使用があります。

私が見たことから、セキュリティはフロントエンドのIf文によって処理されます。たとえば、userlevel = 1の場合、userlevel = 2の場合はこれを行います。これらのステートメントは、グリッドの列を表示または非表示にしたり、データを返すためにクエリを実行したり、必要なその他の制約を与えるために使用されます。企業ユーザーの場合、コードの背後にあるコードはユーザーに割り当てられたcompanyidを取得し、そのcompanyid(サービス、船舶など)に関連付けられたすべてのデータの結果を返すためにクエリで使用します。

これを修正するための推奨事項は高く評価されます。

+0

を保護しますか? – Stu

+0

どうしたらいいのでしょうか?一時テーブルを使用するのではなく、通常のテーブルがバックエンドで作成/破棄されていますか?または、データがUIに送信される前に、アプリケーションの静的変数にロードされていますか?これがどうやって起こるかわからない? – Sam

+0

私はこの問題を完全に理解しているとは思わない...会社がユーザーからフェッチされてクエリに送信されている場合...そして、おそらくクエリが企業情報をフィルタリングしているのであろうか。間違ったデータが戻ってくるでしょうか? – Rikon

答えて

2

実装の詳細を見ることなく言い表すのは難しいですが、表面には企業レベルのキャッシュがあるようです。 OutputCacheの設定、DataSource caching、明示的なキャッシングPage.Cacheなどを確認してください。

この記事は少し古いですが、ほとんどの情報はASP.NET 4.0でもまだ関連しているようです。

ASP.NET Caching: Techniques and Best Practices

+0

キャッシュは、これらの問題を実装する古い方法です。新しいスレッド同期です。 –

+3

これをバックアップするためのドキュメントがありますか?キャッシュは、ASP.NETの非常に一般的なパフォーマンス手法です。 – jrummell

+0

私のほとんどのアプリケーションでは、スレッドを使用しました。キャッシングやセッションを使用しないでください。彼らはしばらくするとあなたを殺しようとします。 –

0

あなたは置くことができ、そのスレッドでif文。スレッディングでは、1人のユーザーしかアプリケーションまたはグリッドビューにアクセスすることができません。 http://msdn.microsoft.com/en-us/library/ms173179.aspx

1

あなたの基本的なモデルは動作するはずです:

は、このリンクを参照してください。あなたが私たちに語ったことは、問題を診断するのに十分ではありません。 しかし、、私はいくつかの推測があります。ほとんどの場合、あなたのコードはUserIDまたはCompanyIDの値を混乱させるでしょう。

  • セッションではなくキャッシュにCompanyIDを間違って保存していますか?
  • CompanyIDは静的変数に格納されていますか? Webアプリケーションの一般的な(そして悲惨な)落とし穴は、静的変数に格納された値がすべてのユーザーにとって同じままであることです。一般に、はasp.netアプリケーションで静的変数を使用しません。
  • dbキャッシングまたは出力キャッシングが、セッションやその他の変数によって適切に変化しないことがあります。したがって、2番目のユーザーは、以前のユーザー用に作成されたものを表示します。何か起こっているキャッシュを停止し、それが修正されているかどうかを確認しますが、そこからデバッグしてください。
  • 上記のテーマの他のバリエーション:クエリが静的変数に格納されている可能性があります。おそらく、これらのユーザー関連の値はキャッシュまたはdbに格納されますが、そのレコードのキー(UserID?)は静的変数に格納されますか?
+0

これは静的変数です。データを取得する主なステートメントは、次のように作成されます。protected void PopulategvServiceRequestListing(string _whereclause)_whereclauseは、ユーザーレベルに基づいて作成されます。私の推測は、ユーザー1がクエリを実行すると、_whereclauseにデータが設定され、ユーザー2がそのレベルに基づいて構築された文字列ではなく、同じ文字列を取得する場合です。 – Infotech

1

jrummerllさんの回答に加えて、私たちのアプリのData Acces Layerをチェックし、静的変数が定義されていないことを確認してください。静的変数を定義すると、2つの競合する要求がたとえばCompanyIDの値を上書きする可能性があるため、この種の問題が発生する可能性があります。

0

結果をフィルタリングするために使用されるアプリケーション全体のサンプルコードを次に示します。 1人のユーザーがログオンしたときに他のユーザーがその結果を表示しないように、これを修正する最善の方法は何ですか?

は無効PopulategvServiceRequestListing(文字列_whereclause)会社のIDが格納されて {

_dsGlobalDatasource = new TelemarServiceRequestListing().GetServiceRequestListingDatasource(_whereclause); 
    if(_dsGlobalDatasource.Tables[0].Rows.Count!=0) 
    { 
     gv_ServiceRequest.DataSource = _dsGlobalDatasource; 
     gv_ServiceRequest.DataBind();   
    } 
    else 
    { 
     gv_ServiceRequest.DataSource=new TelemarServiceRequestListing().DummyDataset(); 
     gv_ServiceRequest.DataBind(); 
     gv_ServiceRequest.Rows[0].Visible = false; 
     gv_ServiceRequest.HeaderStyle.Font.Bold = true; 

    } 

} 
関連する問題