ユーザーインターフェイスから渡された資格情報の名前、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」を取得しています。私は角かっこの異なる組み合わせを試しましたが、何も効果がありませんでした。
@ CREDENTIALNAMEの角括弧を削除してみましたか? –
はい、それを試みました。 CredentialNameは問題ではなく、たとえその部分の文字列連結を使用しても同じ方法で失敗します。 – Tyler
+1、興味深い質問!私は脆弱なインターフェースでバックエンドのクレデンシャルを作成することを許可することをお勧めします...信頼されていないユーザーはなぜDBクレデンシャルを作成する必要があるのですか? – Matthew