【问题标题】:Howto? Parameters and LIKE statement SQL如何?参数和LIKE语句SQL
【发布时间】:2010-09-20 01:25:15
【问题描述】:

我正在编写一个搜索函数,并且已经想到了使用参数来防止或至少限制 SQL 注入攻击的这个查询。但是,当我通过我的程序运行它时,它不会返回任何内容:

SELECT * FROM compliance_corner WHERE (body LIKE '%@query%') OR (title LIKE '%@query%')

可以这样使用参数吗?还是它们仅在以下情况下有效:

SELECT * FROM compliance_corner WHERE body LIKE '%<string>%'(其中<string> 是搜索对象)。

编辑:我正在用 VB.NET 构建这个函数,这对你们贡献的语法有影响吗?

另外,我在 SQL Server 中运行了这个语句:SELECT * FROM compliance_corner WHERE (body LIKE '%max%') OR (title LIKE%max%')` 并返回结果。

【问题讨论】:

    标签: asp.net sql vb.net


    【解决方案1】:

    好吧,我会选择:

     Dim cmd as New SqlCommand(
     "SELECT * FROM compliance_corner"_
      + " WHERE (body LIKE @query )"_ 
      + " OR (title LIKE @query)")
    
     cmd.Parameters.Add("@query", "%" +searchString +"%")
    

    【讨论】:

    • 这是正确的,John 提供的接受的答案有错误的语法!
    • 我不确定他的语法有什么不正确,他的解决方案工作得很好。我有一个函数可以构造并返回一条 SQL 语句,用于数据表或其他任何内容。
    • 附加说明:使用 MySQLDataAdapter 的 C# 语法 = da = new MySQLDataAdapter("SELECT * FROM tableA WHERE fieldA = @fieldA"); da.SelectCommand.Parameters.AddWithValue("@fieldA","%" + someValue + "%");
    • 另一个答案(来自 John)也有效,但确实容易受到类似注入的影响,这可能会产生奇怪的结果,具体取决于您所在领域的目的。
    • 不应该是cmd.Parameters.Add 变成cmdLoad.Parameters.AddWithValue 还是有什么问题?我知道詹姆斯的回答是从 2008 年开始的 :)
    【解决方案2】:

    您的 Visual Basic 代码如下所示:

    Dim cmd as New SqlCommand("SELECT * FROM compliance_corner WHERE (body LIKE '%' + @query + '%') OR (title LIKE '%' + @query + '%')")
    
    cmd.Parameters.Add("@query", searchString)
    

    【讨论】:

    • 正如亚当在他的回答中指出的那样,这并不能防止 SQL 注入。查询应该被参数化。
    • 您能否提供一个示例,说明这并不能防止 SQL 注入?根据我的测试,它工作正常
    • 不开放SQL注入,只开放LIKE注入。这意味着用户可以输入特殊字符,例如% ^_LIKE 将对其进行特殊解释。这意味着用户可能无法获得他们对某些搜索的期望。例如,搜索'less than 1% fat' 可能会返回结果'less than 1% of doctors recommend this - it's full of fat!'
    • 我同意,like 会受到“Like Injection”的影响,而伤害只是用户没有得到他们期望的东西。即使在参数化时,也应始终执行查询清理。仅依靠这种保护并不完全安全。
    • 我还建议您使用searchString.Replace("[","[[]").Replace("%","[%]").Replace("_","[_]"),这样可以避免 LIKE 注入(只要您不使用转义子句)。
    【解决方案3】:

    你必须做的:

    LIKE '%' + @param + '%'

    【讨论】:

    • 优秀的解决方案 - 如果可能的话,会给它超过 +1 !谢谢
    【解决方案4】:

    您可能必须将 % 符号与您的参数连接起来,例如:

    喜欢'%' || @查询 || '%'

    编辑: 实际上,这可能根本没有任何意义。我想我可能误解了你的问题。

    【讨论】:

      【解决方案5】:

      有时,从 VB 执行查询与从 MS SQL / Access 执行查询时,用作占位符 % 的符号不同。尝试将占位符符号从 % 更改为 *。这可能行得通。
      但是,如果您调试并希望直接在 MS SQL 或 Access 中复制您的 SQL 字符串来测试它,您可能必须在 MS SQL 或 Access 中将符号更改回 % 才能实际返回值。

      希望对你有帮助

      【讨论】:

      • 我不确定是否在 2012 年,但是这个 % vs * 是特定于 ADO 和 DAO 引擎的。如果您在 Access 中使用 DAO 或 Current(),则通配符为 *;如果在任何代码中使用 ADO,包括 Access 中的 VBA,通配符是 %。
      【解决方案6】:

      也试试这个方法

      Dim cmd as New SqlCommand("SELECT * FROM compliance_corner WHERE (body LIKE CONCAT('%',@query,'%')  OR  title LIKE CONCAT('%',@query,'%') )")
      cmd.Parameters.Add("@query", searchString)
      cmd.ExecuteNonQuery()
      

      使用 Concat 代替 +

      【讨论】:

        猜你喜欢
        • 2015-06-03
        • 1970-01-01
        • 2021-06-23
        • 1970-01-01
        • 2020-12-23
        • 1970-01-01
        • 1970-01-01
        • 2015-12-03
        • 2014-05-26
        相关资源
        最近更新 更多