【问题标题】:Preventing SQL injection when setting a sqldatasource select statement in ASP.NET c#在 ASP.NET c# 中设置 sqldatasource 选择语句时防止 SQL 注入
【发布时间】:2012-07-12 21:35:56
【问题描述】:

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

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

我使用这种方法创建查询:

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

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

提前致谢

【问题讨论】:

  • Mike91:有两种方法可以问这个问题。第一种方法是“我很懒。有人可以发布指向参数化查询的文档的链接......或者更好 - 只需为我编写我的代码吗?”。第二种方式是“我已经阅读了文档并且理解了原理,但我不确定如何将其应用于此查询:“...”。我尝试了这个:“...”但它给出了这个错误:“...”。知道如何解决这个问题吗?“。您认为哪个问题更有可能得到答案?
  • +1 表示有很好的提问意识。我真的,真的希望更多人这样做。

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


【解决方案1】:
sqldatasource.SelectCommand = @"SELECT x from x where this_id LIKE @inText ORDER BY x ASC";

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

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

【讨论】:

    【解决方案2】:

    一种(不是很好,但总比没有好)的方法是对 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 不会。

    【讨论】:

    • 这与参数化查询无关。
    • :filter - 这看起来像 mysql,问题是 sqlserver。
    • @Dems:也许我理解错了,但是在原帖中,发帖人是在询问避免SQL注入的方法。参数化查询是避免 SQL 注入问题的一种方法。此外,在问题的最后,OP 写道:“请有人解释一下我可以如何参数化它以防止我的应用程序中的 SQL 注入?”所以,是的,我的回答与问题相关。
    • @Hogan:你是对的——我很抱歉。 SQL Server 使用 @ 而不是 : 作为参数名称。我也省略了绑定变量的声明。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-04
      • 2011-04-30
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多