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