使用 method 的 SQL 命令中的参数化查询

Parameterized Query in SQL command with method

提问人:newbieForAngular 提问时间:4/11/2018 最后编辑:newbieForAngular 更新时间:4/11/2018 访问量:1773

问:

现在我想把它变成一个参数化查询,这样它就不容易发生SQL注入。代码如下:

 string sqlText = "SELECT @EmployeeColumn FROM Test_Attachments WHERE Project_Id = @PID1 AND [Directory] = '" + qAttachment.Directory1.Replace("\\\\" + Root_Directory, "") + "' ";

 try 
 {
     SqlCommand myCommand = new SqlCommand(sqlText, SqlConnection);

     myCommand.Parameters.AddWithValue("EmployeeColumn", Employee_Column);
     myCommand.Parameters.AddWithValue("PID1", Project_ID1");
 }
 .....

如何使查询参数化?尤其是方法。谢谢

编辑: 不好意思。我是在手机上输入的,所以它有很多错别字。谢谢!

C# asp.net sql-server sql-injection parameterized-query

评论

0赞 nvoigt 4/11/2018
这就像将 4 个错误汇总到一个语句中。你为什么不先尝试一些简单的东西,比如一个参数,然后让它工作呢?
0赞 Chris Dunaway 4/11/2018
旁注:变量周围不应有撇号。@PID1

答:

0赞 adglopez 4/11/2018 #1

PID1 已经参数化,因此您可以对 Directory 进行类似的操作。SELECT 子句中还有另一个问题,AddWithValue 无法选择要在 SELECT 中投影的列,但您可以对此进行验证(我添加了一个包含所有内容的示例,但应该进一步重构)

string sqlText = "SELECT {{columnName}} FROM Test_Attachments WHERE Project_Id =@PID1 AND [Directory] = @Directory";

var allowedColumns = new List<string>{"columnA", "columnB"};

if(allowedColumns.Contains(Employee_Column)
{
   sqlText = sqlText.Replace("{{columnName}}", Employee_Column);
} 
else
{
   throw new Exception($"Invalid Column {Employee_Column}");
}

try {
    SqlCommand myCommand = new SqlCommand(sqlText, SqlConnection);

    var directory = qAttachment.Directory1.Replace("\\\\" + Root_Directory, "");

     myCommand.Parameters.AddWithValue("@PID1", Project_ID1);
     myCommand.Parameters.AddwithValue("@Directory", directory);

     ...
}

评论

0赞 maccettura 4/11/2018
OP 希望避免 SQL 注入漏洞。你的答案仍然很脆弱。
0赞 adglopez 4/11/2018
我的印象是,使用SqlParamterCollection(myCommand.Parameters)具有通过模板化查询和限制传入变量的范围来防止注入的机制。你能详细说明一下它是如何不能预防的吗?你会改变什么来防止这种情况发生?
1赞 maccettura 4/11/2018
我的错,我在移动设备上,所以我没有看到您过滤 columnName 的逻辑。这不是 100% 的完整证据,但我想这已经足够了。
0赞 newbieForAngular 4/11/2018
谢谢@adglopez。我将尝试这个并在 veracode 中执行