asp.net - 使用 system.data.oracleclient 构建良好的搜索查询

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

我正在一个类中构造一个搜索函数,供我们的几个 asp 页面使用。这个想法很简单,从用户那里获取搜索词并在数据库中查询该项目。目前我这样做的方式是错误的,这很容易受到 SQL 注入(inject)攻击(并且 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破坏我的系统。 现在,正确的方法是创建一个适当的 oracle 变量,方法是将 :searchterm 放入字符串中并添加以下行:

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

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

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

最佳答案

不要在 VB 代码中进行串联,而是在 SQL 语句中进行串联。那么你想做的事情应该有效。下面是一些 SQL 来说明我正在讨论的内容:

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

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

关于asp.net - 使用 system.data.oracleclient 构建良好的搜索查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1412023/

相关文章:

css - 将 @font-face 与 Web 控件库中嵌入的字体一起使用

oracle - 在docker容器中安装oracle客户端

linux - 如何从另一台机器连接到Oracle数据库?

asp.net - 如何在 IIS Express 下启用区分大小写?

asp.net - 复选框用户选择验证问题

vb.net - 选项卡索引不适用于面板中的控件?

ubuntu - ubuntu 上 unixodbc 的 ODBCDM_Home 的正确值是多少

c# - 身份验证过滤器 : How to do a HTTP 401 with message

iphone - 编辑 asp header

c# - 对文件夹名称数组进行排序,如 Windows 资源管理器(按数字和字母顺序)- VB.NET