所以我有点问题。在我正在开发的网站上,我允许人们输入地址,一旦他们点击保存按钮,他们输入的地址就会存储在我的数据库中。
我(错误地)认为使用参数化查询有助于防止SQL注入,这是我的代码一旦按下"保存"
SqlConnection Conn = new SqlConnection(@"Data Source=**********;Initial Catalog=********;Persist Security Info=True;User ID=******;Password=*********");
SqlCommand updateMeeting = new SqlCommand(@"UPDATE [*******].[dbo].[**********] SET Title=@title, Date=@date, Location=@location, Announcement=@announcement WHERE Title = '" + commands[1] + "' AND Date = '" + Convert.ToDateTime(commands[2]) + "' AND Location = '" + commands[3] + "'", Conn);
updateMeeting.Parameters.AddWithValue("@title", newTitle);
updateMeeting.Parameters.AddWithValue("@date", newDate);
updateMeeting.Parameters.AddWithValue("@location", newLocation);
updateMeeting.Parameters.AddWithValue("@announcement", newBody);
updateMeeting.Connection.Open();
updateMeeting.ExecuteNonQuery();
updateMeeting.Connection.Close();
newTitle,newDate,newLocation和newBody只是从相关文本框中获取的字符串变量。
请放心,命令数组已经过清理。这不是我的注射问题发挥作用的地方。
但如果我在我的"位置"中输入以下内容文本框注入攻击成功,一行被添加到我的数据库
');INSERT INTO [********].[dbo].[*********] (Title) VALUES ('Injection'); --
很明显我错过了一些内容,或者我不理解这些参数化查询的工作原理。不是这件事的全部意义,以确保"位置"的VarChar值。只是"'); INSERT INTO [****]。[dbo]。[******](标题)价值观('注射'); - "
注射攻击不应该失败吗?
答案 0 :(得分:4)
您真的很接近 - 您已经参数化了要更新的值,但没有参数化WHERE
子句中的值。尝试这样的事情:
SqlConnection Conn = new SqlConnection(@"Data Source=**********;Initial Catalog=********;Persist Security Info=True;User ID=******;Password=*********");
SqlCommand updateMeeting = new SqlCommand(@"
UPDATE [*******].[dbo].[**********]
SET Title=@title,
Date=@date,
Location=@location,
Announcement=@announcement
WHERE Title = @commands1
AND Date = @commands2
AND Location = @commands3",
Conn);
updateMeeting.Parameters.AddWithValue("@title", newTitle);
updateMeeting.Parameters.AddWithValue("@date", newDate);
updateMeeting.Parameters.AddWithValue("@location", newLocation);
updateMeeting.Parameters.AddWithValue("@announcement", newBody);
updateMeeting.Parameters.AddWithValue("@commands1", commands[1]);
updateMeeting.Parameters.AddWithValue("@commands2", Convert.ToDateTime(commands[2]));
updateMeeting.Parameters.AddWithValue("@commands3", commands[3]);
updateMeeting.Connection.Open();
updateMeeting.ExecuteNonQuery();
updateMeeting.Connection.Close();
答案 1 :(得分:1)
它不是参数化查询。在您的where
条款中,您只是连接字符串:
"... WHERE Title = '" + commands[1] + "' AND Date = '" + Convert.ToDateTime(commands[2]) + "' AND Location = '" + commands[3] + "'"