1

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

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

我使用此方法创建查询:

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

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

提前致谢

4

3 回答 3

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

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

请注意,如果您LIKE以通配符开头 a,您将会感到痛苦。一张大桌子会伤心,慢慢走。

于 2012-07-12T21:55:06.300 回答
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 条件,然后将其传入。

数据库上的查询很简单,例如:

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

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

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

于 2012-07-12T21:51:46.240 回答
-1

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

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

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

于 2012-07-12T22:21:02.567 回答