2

いくつかの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 ステートメントをその一部にすることはできますか?

4

2 に答える 2

5

VB コードで連結を行う代わりに、SQL ステートメントで連結を行います。次に、あなたがやろうとしていることはうまくいくはずです。私が話していることを説明するSQLは次のとおりです。

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

ところで、ELEMENT_NAME の照合を大文字と小文字を区別しないように切り替えてから、upper() の呼び出しを削除すると、より効率的なクエリになる可能性があります。

于 2009-09-15T21:47:51.633 に答える