1

我需要使用从用户界面传入的凭据名称、身份和密码在 .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方法旨在供受信任的管理员使用。

您动态创建它似乎很棘手,因为“制作存储过程”的典型答案在这里不适用。理想情况下,您应该在接受的答案中使用对象模型......但是,如果您出于某种原因无法使用该对象模型,则需要以某种方式清理参数。

限制参数的长度怎么样?这不是万无一失的,但应该让你大部分时间。另一种可能的方法是在参数字符串中搜索“查询词”之类SELECTUPDATE等......这些词的存在可能会导致参数被拒绝。

一种更复杂的方法可能是尝试使用较低级别的帐户运行参数(CREATE CREDENTIAL在事务中没有优先权)。如果没有注入,那么您预计只会出现一次失败,如果有注入,您可以期待不同的结果......然后回滚交易。

不过,我的意见是,您不应该允许将此功能暴露给可能不受信任的用户。

于 2012-05-04T19:23:17.830 回答