在ASP.NET中设置sqldatasource select语句时阻止SQL注入

时间:2012-07-12 21:35:56

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

关于在我的应用程序中阻止SQL注入,我有一个简单的问题。

我的Web应用程序的两个不同功能使用文本框,用户可以使用这些文本框从MSSQL数据库中搜索项目。此信息显示在GridView中。

我使用此方法创建查询:

sqldatasource.SelectCommand = "SELECT x from x where this_id LIKE '%" + txtbox.Text + "%' ORDER BY x ASC";

显然,用户输入并将其直接输入到这样的查询中会打开基本的SQL注入。请问有人可以解释我如何参数化以防止在我的应用程序中使用SQL注入?

提前致谢

3 个答案:

答案 0 :(得分:5)

sqldatasource.SelectCommand = @"SELECT x from x where this_id LIKE @inText ORDER BY x ASC";

cmd.Parameters.AddWithValue("@inText", "%" + txtbox.Text + "%");

注意,如果您使用通配符启动LIKE,您将会感到痛苦。一张大桌子会很伤心,慢慢来。

答案 1 :(得分:0)

一种(不是很好,但总比没有好)的方法是清理txtBox.Text的内容,然后使用已清理的结果。

sqlsource.SelectCommand = "SELECT x from x where this_id LIKE '%" + SanitizedString(txtBox.Text) + "%';";

// ... codes ...

private string SanitizedString(string given)
{
   string sanitized = given.Replace(";", string.Empty);
   sanitized = sanitized.Replace("--", string.Empty);
   // ... ad nauseum, conditions galore ...

   return sanitized;
}

......然而,这非常耗费人力。

要做的是以存储过程的形式使用绑定变量。从我所看到的,您可以绑定您的过滤器txtbox.Text条件,然后将其传入。

db上的查询很简单,例如:

SELECT x from X where this_id LIKE :filter ORDER BY x ASC

要调用它,您需要研究MSSQL如何与存储过程进行通信。

绑定变量使您的代码彻底防止SQL注入。 爱绑定变量,因为他们会爱你。邪恶的hax0rs不会。

答案 2 :(得分:-1)

感谢您的回答。最后,我在MSDN网站上使用了这个参数化查询:

    GetSubInfo.SelectParameters.Add("xparam", txtbox.Text);
    GetSubInfo.SelectCommand = "SELECT x from x where x_id LIKE @xparam ORDER BY x ASC";

这与Hogan的答案非常相似,语法略有不同。希望这有帮助!