提问人:newbieForAngular 提问时间:4/11/2018 最后编辑:newbieForAngular 更新时间:4/11/2018 访问量:1773
使用 method 的 SQL 命令中的参数化查询
Parameterized Query in SQL command with method
问:
现在我想把它变成一个参数化查询,这样它就不容易发生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");
}
.....
如何使查询参数化?尤其是方法。谢谢
编辑: 不好意思。我是在手机上输入的,所以它有很多错别字。谢谢!
答:
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 中执行
评论
@PID1