2009-06-07 10 views
1

C#アプリケーションとSQL Server 2005のデータベースにデータを追加できるユーザーのアクセス許可を維持するための良い方法を探しています。データを追加するSQLの権限と検証方法

これを明確にするためには説明する必要があります。

私は2人のユーザーBobJimを持っていますが、どちらもSQL権限に追加されているため、データベースへの書き込みアクセス権があります。すべてのアクセスはドメインユーザーアカウントに基づいています。他のすべてのユーザーには読み取りアクセス権しかありません。だから、UserPermissionsユーザーとBookPublishersのリストが含まれてい

  • ユーザー
  • UserPermissions
  • ブックス
  • BookPublishers

今私は、次のようなカップルのテーブルを持っています。たとえば、BobMS PressJimの書籍を追加する権限があり、O'Reillyの書籍を追加する権限があります。

この情報を確認し、追加できるものを制限する必要があります。

そう言うJimは、コマンドラインから自分のアプリケーションを使用して、彼は次のようなものを書き込みます:先に行くと書籍のテーブルに本を追加する必要があります

Addbook.exe "C# 3.0 in a Nutshell" "O'Reilly"

ツール。

今度は、と同じコマンドが試されますが、O'Reillyで書籍を追加する権限がないためツールにエラーが発生するはずです。

今私はいくつかのことをする方法を知る必要があります。

  • ユーザーが最初のユーザーはまた、私は上記の前に真実であることを確認する必要があり、特定の出版社
  • booksを追加するための書き込み許可を持っていることを確認してくださいSQL Serverの
  • への書き込み許可を持っていることを確認しますツールは実際にデータを追加しようとします。つまり、ツールが続行される前に検証のフィードバックが必要です。

私は100%悪意のあるデータの注入を心配していませんが、それは内部ツールであり、私は私はユーザーを信頼することができます...(可能性があります)

どこから始めるべきか分かりません。私のSQLスキルは非常に不足しています。

Akk、もう1つ、私はストアプロシージャを使用してデータを追加したくありません。

+0

SQL Serverのアクセス許可のメタデータを直接クエリする必要があります。これを行うために呼び出すことができるストアドプロシージャはいくつかありますが、それは簡単な作業ではないことを覚えているようです。 –

答えて

5

さて、これを打破してみましょう:

は、ユーザーが(ない場合は、これが1 trueの場合、0を返します)表に書き込むことができることを確認します。

SELECT isnull(has_perms_by_name('MyDb.dbo.MyTable', 'OBJECT', 'INSERT'), 0) 

は、ユーザーが書き込むことができることを確認しますその出版社:

SELECT count(*) FROM UserPermissions WHERE 
UserName = 'username' AND Publisher = 'publisher' 

これは、実際のC#ではなく、それらのSQLです。 C#での値を取得するには:最後の注意点として

SqlConnection SqlConn = new SqlConnection("connection_string_goes_here"); 
SqlCommand SqlCmd = new SqlCommand(); 

SqlConn.Open(); 
SqlCmd.Connection = SqlConn; 
SqlCmd.CommandText = "SELECT isnull(has_perms_by_name('MyDb.dbo.MyTable', " + 
    "'OBJECT', 'INSERT'), 0)" 

if (SqlCmd.ExecuteScalar()) 
{ 
    SqlCmd.CommandText = 
     "SELECT count(*) FROM UserPermissions WHERE " + 
     "Username = " + System.Environment.UserDomainName + "\" + 
      System.Environment.UserName + " " + 
     AND Publisher = @Publisher"; 
    SqlCmd.Parameters.Add("@Publisher", SqlDbType.NVarChar); 
    SqlCmd.Parameters("@Publisher").Value = PublisherInput; 

    if(SqlCmd.ExecuteScalar()) 
    { 
     SqlCmd.Parameters.Clear(); 
     SqlCmd.CommandText = "INSERT INTO Books (Title, Publisher) VALUES " + 
          "(@Title, @Publisher)"; 
     SqlCmd.Parameters.Add("@Title", SqlDbType.NVarChar); 
     SqlCmd.Parameters.Add("@Publisher", SqlDbType.NVarChar); 
     SqlCmd.Parameters("@Title").Value = TitleInput; 
     SqlCmd.Parameters("@Publisher").Value = PublisherInput; 
     SqlCmd.ExecuteNonQuery(); 
    } 
} 

SqlCmd.Dispose(); 
SqlConn.Close(); 
SqlConn.Dispose(); 

をご入力を清めます。アプリケーション内のパラメータを使用してください。は、内部のものでもであっても、ユーザーを信頼しません。私は十分にそれを強調することはできません。

編集:猫の皮を剥ぐために複数の方法があるので、私は(少なくともカウント問題への)SQL溶液にLINQを含まないために私のそれは愚かに感じた:

int PermsAvailable = (from up in db.UserPermissions 
         where up.Username == 
          System.Environment.UserDomainName + "\" + 
          System.Environment.UserName 
         && up.Publisher == PublisherInput 
         select up).Count(); 
if(PermsAvailable) 
{ 
    var NewBook = New Book with {.Title = TitleInput, .Publisher = PublisherInput}; 
    db.Books.Add(NewBook); 
} 
+0

恐ろしいですが、私はコードにはそれほど悪くはありませんが、アクセス権をチェックして継続するのが正しい方法だと、それ以上のものでした。それは悪くないように見え、これは私が期待していたことをかなりカバーしています。ありがとう。 –

3

This articleは、特定の権限を持つアプリケーションを固定する様々な方法の説明を有します。使用されているアーキテクチャを理解するために、シリーズの残りの部分と以前のASP.NET 2.0シリーズを読む価値があります。

+0

サイトにSQL Server ASP.NETメンバーシッププロバイダを追加する方法についての良い記事ですが、タスクを実行する権限が付与される前にコードを使用してロールメンバーシップを確認しています。質問の状況は疑問です。SQL Serverのセキュリティ自体を使用してデータベースへのアクセス許可を与えたり拒否したりすることです。C#コードでは、これらのアクセス許可の内容を判断する必要があります。 –

+0

これは私もいくつかのasp.netコントロールが必要なので非常に便利です。唯一の捉え方は、この質問のためには少し話題になっていたということです。 –

1

からユーザビリティの観点からは、UIの編集可能性を管理するのが面白いとは思えません。ユーザーとして、データを入力して、そのエントリを作成する権限がないというメッセージが表示されたら、あなたのウェブサイトへの参加を続けることは勧められません。

ユーザーがデータベースにエントリを追加できない場合は、読み取り専用ページ(またはDIV)を表示できます。新しいエントリを保存する権限を持つユーザーは、編集可能なページ/ DIVを取得します。

一部の情報カテゴリを保存することは許可されていますが、他のカテゴリは保存できないユーザーの場合、ドロップダウンリストを使用してそのカテゴリのエントリを制限しますか?たとえば、BobのパブリッシャのドロップダウンリストにはMSPressが表示され、JimのリストにはO'Reillyが含まれます。こうすることで、データを追加しようとする前に許可されていることをリストから明確に見ることができます。権限は秘密ではなく、ユーザーから隠されています。

+0

これは実際にAPI、CMD、およびGUIツールの両方で使用されます。だから大抵の場合、それは大丈夫になるでしょう。 CMDツールは、必要に応じてパラメータを渡すように設計されており、ユーザはこれを確認する必要があります。彼らはこの権利を得ると予想され、そうでなければツールはエラーになります。 –

関連する問題