【问题标题】:Search Function not working properly搜索功能无法正常工作
【发布时间】:2011-12-26 16:30:59
【问题描述】:

我有一个使用名为“name”的参数调用的函数,现在它可以正常工作了.. 直到我在其中使用 ' 进行搜索.. 所以我将其作为名称发送

Plastic & Foam 3'X5' XLT

当我发送它时,它在网站中返回空(没有错误),但如果我发送 jusr Plastic & Foam 它工作正常,它返回正常。现在在 sql 部分,当我像这样通过管理工作室发送查询时,我得到了这个

exec sp_productSearch 'Plastic & Foam 3''X5'' XLT'

SELECT Name FROM PProducts WHERE NAME LIKE '%Plastic & Foam 3'X5' XLT'
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'X5'.

在 C# 中,我正在发送文本列表

Server.HtmlEncode(txtproductname.Text.Trim().Replace("'", "''"))

任何想法我可能做错了什么?

PS:存储过程很简单,就是这样的

Select Name from PProducts Where NAME LIKE '%' + @NAME  + '%' ;   

谢谢。

【问题讨论】:

  • 在您的搜索查询/数据库中允许' 是一种非常糟糕的做法(sql 注入)
  • 我们需要查看 C# 代码,而不是 SQL 查询,才能回答这个问题。另外,请更改标题以总结您的问题。谢谢。
  • 请包含您的 C# 代码,以显示您调用 sp_productSearch 存储过程的位置。我怀疑您需要在 SQL 查询中使用参数,而不是注入字符串的值来直接搜索到您的存储过程调用。
  • 为什么你HtmlEncode 任何东西当它转到 SQL Server 时?你在使用参数化查询吗?
  • 请将整个过程贴出来,让我们看看您是否需要使用动态 SQL。

标签: c# asp.net visual-studio-2010 sql-server-2008


【解决方案1】:

您将 ' 字符“原始”传递给 SQL 中的查询?您遇到了一个名为 SQL injection 的问题。

请找出将数据“安全”传递到您的 SQL 服务器的解决方案。对于 C#,您应该查看 eg. this question 以获得更详细的提示。

【讨论】:

【解决方案2】:

您似乎已经有一个名为@NAME的参数

所以你的存储过程只需要这样做

SELECT Name
FROM   PProducts
WHERE  NAME LIKE '%' + @NAME + '%' 

或者,更好的是,如果您的任何产品名称包含 % 等模式字符,它会返回正确的结果,根本不要使用 LIKE 并使用

SELECT Name
FROM   PProducts
WHERE  CHARINDEX(@NAME,NAME) > 0

或者,更好的是,使用全文搜索

我假设您正在存储过程中构建查询字符串,然后执行它。根据您迄今为止发布的内容,这不是必需的,并且存在 SQL 注入风险。

也不要手动转义txtproductname.Text 值。使用参数“按原样”传递它。

【讨论】:

    【解决方案3】:

    已编辑

    你问题的最后一部分有点吓人

    Select Name from PProducts Where NAME LIKE ''%' + @NAME  + '%'''
    

    我想知道你为什么使用这么多引号,并且可以通过字符串连接来执行 SQL:

    EXEC 'Select Name from PProducts Where NAME LIKE ''%' + @NAME  + '%'''
    

    如果是这种情况,那么解决它的一种快速/肮脏的方法是两次转义引号,这意味着:

    EXEC sp_productSearch 'Plastic & Foam 3''''X5'''' XLT'
    

    该语句应该可以正常运行但是使用用户输入执行 SQL 查询的方式非常糟糕。其他答案已经涵盖了。

    另一方面,& 根据this page 调用 Html Encode 会变成 &,所以也要小心。

    【讨论】:

    • 阅读问题。他们说SSMS中的这个查询exec sp_productSearch 'Plastic & Foam 3''X5'' XLT'会产生这个错误Incorrect syntax near 'X5'.。看不到HTMLEncode 并且它自己搜索Plastic & Foam 而不是Plastic & Foam 只会意味着潜在的错误结果而不是语法错误。虽然我同意使用它似乎不正确。
    • 那些exta引号是写错了谢谢
    猜你喜欢
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多