带方法的 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 命令中的参数化查询的主要内容,如果未能解决你的问题,请参考以下文章