带方法的 SQL 命令中的参数化查询

Posted

技术标签:

【中文标题】带方法的 SQL 命令中的参数化查询【英文标题】:Parameterized Query in SQL command with method 【发布时间】:2018-09-21 10:51:02 【问题描述】:

现在我想让它成为一个参数化查询,这样它就不容易被 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");
 
 .....

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

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

【问题讨论】:

这就像一个语句中包含了 4 个错误。你为什么不先尝试一些简单的东西,比如一个参数,然后让它工作呢? 旁注:@PID1 变量周围不应有撇号。 【参考方案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);

     ...

【讨论】:

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

以上是关于带方法的 SQL 命令中的参数化查询的主要内容,如果未能解决你的问题,请参考以下文章

带参数的sql查询语句

sql参数查询

VBA/SQL 参数化查询 - 字段列表中的未知列

带正则表达式的参数化 SQL、ORACLE 与 SQL Server

sql参数化查询

参数化查询中的 JavaScript 错误