1

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

これを明確にするために説明する必要があります。それでは、これの例を見てみましょう:

私には と の 2 人のユーザーがいBobJim、どちらも SQL パーミッションに追加されているため、データベースへの書き込みアクセス権があります。現在、すべてのアクセスはドメイン ユーザー アカウントに基づいています。他のすべてのユーザーには、読み取りアクセスのみがあります。

現在、次のようなテーブルがいくつかあります。

  • ユーザー
  • ユーザー権限
  • 書籍
  • 書籍出版社

したがってUserPermissions、Users と BookPublishers のリストが含まれます。たとえば、 にはBobの本を追加する権限があり、 には の本をMS Press追加Jimする権限がありO'Reillyます。

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

それでJim、コマンドラインから私のアプリケーションを使用し、彼は次のようなものを書いているとしましょう:

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

ツールは先に進み、本を book テーブルに追加する必要があります。

Bob、同じコマンドを試してみると、彼は によって書籍を追加する権限がないため、ツールはエラーになるはずO'Reillyです。

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

  • ユーザーが最初に SQL Server への書き込み権限を持っていることを確認する
  • booksユーザーが特定のパブリッシャーによって追加するための書き込み権限を持っていることを確認します
  • また、ツールが実際にデータを追加しようとする前に、上記が正しいことを確認する必要があります。つまり、ツールが続行する前に、まず確認のフィードバックが必要です。

今は、ユーザーが悪意のあるデータを挿入することを 100% 心配しているわけではありませんが、それを止めればいいのですが、これは内部ツールであり、ユーザーを信頼できると思います... (おそらく)

いずれにせよ、どこから始めればよいかわかりません。私の SQL スキルは非常に不足しています。

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

4

3 に答える 3

6

さて、これを分解しましょう:

ユーザーがテーブルに書き込めることを確認します(これにより、trueの場合は1が返され、そうでない場合は0が返されます)。

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

ユーザーがその発行元を作成できることを確認します。

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

さて、それはそれらのSQLであり、実際のC#ではありません。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();

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

編集:猫の皮を剥ぐ方法は複数あるので、LINQ to SQLソリューションを含めないのは愚かだと感じました(少なくともカウントの問題について):

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);
}
于 2009-06-07T18:57:46.513 に答える
3

この記事では、特定のアクセス許可でアプリケーションを保護するさまざまな方法について説明します。使用されているアーキテクチャを理解するには、シリーズの残りの部分と以前の ASP.NET 2.0 シリーズを読む価値があります。

于 2009-06-07T18:35:07.103 に答える
1

ユーザビリティの観点からは、UI で編集可能性を管理する方が使いやすいのではないかと思います。ユーザーとして、私がデータを入力し、その入力を行う権限がないというメッセージを平手打ちされた場合、私はあなたのウェブサイトに参加し続けるよう奨励されることはありません.

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

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

于 2009-06-07T19:02:36.223 に答える