1

ユーザー インターフェイスから渡された資格情報名、ID、およびパスワードを使用して、.NET で CREATE CREDENTIAL ステートメントを作成する必要があります。単純な実装は次のようになります (VB を許してください)。

Dim cmd As SqlClient.SqlCommand = c.CreateCommand
cmd.CommandText = "CREATE CREDENTIAL [" & credentialName & "] WITH IDENTITY = N'" & identityName & "', SECRET = N'" & password & "'"

動作しますが、SQL インジェクションに対して脆弱です。私はこのようなパラメータを使用しようとしました:

cmd.CommandText = "CREATE CREDENTIAL [@CREDENTIALNAME] WITH IDENTITY = @IDENTITYNAME, SECRET = @PASSWORD"
cmd.Parameters.AddWithValue("@CREDENTIALNAME", "myCred")
cmd.Parameters.AddWithValue("@IDENTITYNAME", "Tyler")
cmd.Parameters.AddWithValue("@PASSWORD", "SecretPassword")

しかし、 「@IDENTITYNAME」の近くで構文が正しくありませんというエラーが表示されます。ブラケットのさまざまな組み合わせ/ブラケットなしを試しましたが、何も機能しませんでした。

4

2 に答える 2

2

CREATE CREDENTIAL文字列や式ではなく、資格情報名を取ります。

Credential.Createメソッドを調べることができます。

于 2012-05-04T19:27:53.693 に答える
1

これを簡単に達成できるとは思いません。動的スクリプトの作成を意図している場合。
このCREATE CREDENTIAL方法は、信頼できる管理者が使用することを目的としています。

「ストアドプロシージャを作成する」という典型的な答えはここでは当てはまらないため、動的に作成するのは難しいようです。理想的には、受け入れられた回答でオブジェクトモデルを使用する必要があります...ただし、何らかの理由でそのオブジェクトモデルを使用できない場合は、何らかの方法でパラメーターをスクラブする必要があります。

パラメータの長さを制限するのはどうですか? これは絶対確実というわけではありませんが、ほとんどの場合はうまくいくはずです。SELECT別の可能な方法は、パラメーター文字列で「クエリワード」などを検索することUPDATEです...これらの単語が存在すると、パラメーターが拒否される可能性があります。

より複雑な方法は、下位レベルのアカウントでパラメータを試して実行することです (CREATE CREDENTIALトランザクションで最初の権限なし)。注入がない場合は、単一の失敗のみが予想されます。注入があった場合は、異なる結果を期待してください...その後、トランザクションをロールバックします。

ただし、私の意見では、この機能が潜在的に信頼できないユーザーに公開されることを許可すべきではありません。

于 2012-05-04T19:23:17.830 に答える