ASP.NET中使用参数化查询的SQL注入

时间:2015-10-16 20:28:38

标签: c# sql asp.net sql-injection

所以我有点问题。在我正在开发的网站上,我允许人们输入地址,一旦他们点击保存按钮,他们输入的地址就会存储在我的数据库中。

我(错误地)认为使用参数化查询有助于防止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]。[******](标题)价值观('注射'); - "

注射攻击不应该失败吗?

2 个答案:

答案 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] + "'"