2012-05-04 12 views
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」を取得しています。私は角かっこの異なる組み合わせを試しましたが、何も効果がありませんでした。

+0

@ CREDENTIALNAMEの角括弧を削除してみましたか? –

+0

はい、それを試みました。 CredentialNameは問題ではなく、たとえその部分の文字列連結を使用しても同じ方法で失敗します。 – Tyler

+0

+1、興味深い質問!私は脆弱なインターフェースでバックエンドのクレデンシャルを作成することを許可することをお勧めします...信頼されていないユーザーはなぜDBクレデンシャルを作成する必要があるのですか? – Matthew

答えて

2

CREATE CREDENTIALがかかります秘密鍵証明書の名前。文字列または式ではありません。

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

+0

+1これは正しいようです。オブジェクトを使用し、文字列をスクリプトに連結しないでください。 – Matthew

+0

私はおそらくこの名前空間を保持することは厄介なので、私はおそらくこの答えを確認しませんが、確かに正しいと思われます。ありがとう! – Tyler

1

これは簡単にはできないと思います。動的スクリプトを作成する予定がある場合。
CREATE CREDENTIALメソッドは、信頼できる管理者が使用するためのものです。

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

パラメータの長さを制限するのはどうですか?これは愚かではありませんが、ほとんどの方法であなたを得る必要があります。 もう1つの可能な方法は、パラメータ文字列内で "照会語"、例えばSELECTまたはUPDATEなどを検索することです。これらの語句が存在すると、パラメータが拒否される可能性があります。

より複雑な方法は、トランザクションの最初のCREATE CREDENTIALへのアクセス権がなく、より低いレベルのアカウントでパラメータを実行しようとすることがあります。 注入がない場合は、あなたは異なる結果が...その後、トランザクションをロールバック期待することができ、注射がありました。

私の意見は、しかし、あなたは、この機能は、潜在的に信頼できないユーザーに公開できるようにするべきではないということである。

関連する問題