【问题标题】:Constructing a good search query using system.data.oracleclient使用 system.data.oracleclient 构建良好的搜索查询
【发布时间】:2010-11-27 13:48:45
【问题描述】:

我正在一个类中构建一个搜索功能,供我们的几个 asp 页面使用。这个想法很简单,从用户那里获取一个搜索词并在数据库中查询该项目。目前我这样做是错误的,它很容易受到 SQL 注入攻击(如果出现问题,ELMAH 会在那里挽救一天):

Public Shared Function SearchByName(ByVal searchterm As String) As DataTable
    SearchByName = New DataTable

    Dim con As New OracleConnection(System.Configuration.ConfigurationManager.ConnectionStrings("OracleDB").ConnectionString)



    Try
        con.Open()
        Dim SqlStr As String = "select ID_ELEMENT, ELEMENT_NAME from table_of_elements where upper(ELEMENT_NAME) like upper('%" & searchterm & "%')"
        Dim cmd As New OracleCommand(SqlStr, con)
        SearchByName.Load(cmd.ExecuteReader)





    Catch ex As Exception
        Elmah.ErrorSignal.FromCurrentContext().Raise(ex)

    End Try
    con.Close()
    con.Dispose()




    Return SearchByName
End Function

字符串连接不好。接下来你知道,Bobby Tables 破坏了我的系统。 现在,执行此操作的正确方法是通过将 :searchterm 放入字符串并添加以下行来创建适当的 oracle 变量:

cmd.Parameters.Add(New OracleParameter("SEARCHTERM", searchterm))

问题是因为我使用了 like 语句,我需要能够在搜索词的任一侧都有 %,而我似乎无法使用 '%:searchterm%' 来做到这一点,它只是给出ORA-01036 错误:非法变量名/编号。

我可以参数化,但我的灵活 like 语句仍然是其中的一部分吗?

【问题讨论】:

    标签: asp.net vb.net oracleclient system.data.oracleclient ora-01036


    【解决方案1】:

    不要在 VB 代码中进行连接,而是在 SQL 语句中进行连接。那么你想要做的应该工作。这是一些说明我在说什么的 SQL:

    select ID_ELEMENT, ELEMENT_NAME 
    from table_of_elements 
    where upper(ELEMENT_NAME) like ('%' || upper(:searchterm) || '%')
    

    顺便说一句,如果您将 ELEMENT_NAME 上的排序规则切换为不区分大小写,然后删除对 upper() 的调用,您最终可能会得到更高效的查询。

    【讨论】:

    • 我要快速测试一下。如果这行得通,您将成为 100 个闪亮新代表的快乐拥有者。
    【解决方案2】:

    由于您使用的是 oracle,另一种选择是使用 Oracle Text 来执行搜索。

    正确设置可能需要一些时间,但如果您有大量文本要搜索,或者有某种结构化数据,它可以为您提供比简单的通配符比较更多的选择。

    如果您也遇到这个问题,它还具有处理多种语言的一些不错的功能。

    【讨论】:

    • 我的问题的范围比您的链接的含义要窄一些,但它使阅读变得非常有趣,我要感谢您。
    猜你喜欢
    • 1970-01-01
    • 2013-08-03
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    相关资源
    最近更新 更多