方法?パラメーターとLIKEステートメントSQL


80

私は検索関数を作成しており、SQLインジェクション攻撃を防止するか、少なくとも制限するためにパラメーターを使用してこのクエリを考えました。ただし、プログラムで実行しても何も返されません。

SELECT * FROM compliance_corner WHERE (body LIKE '%@query%') OR (title LIKE '%@query%')

パラメータはこのように使用できますか?または、次のようなインスタンスでのみ有効ですか。

SELECT * FROM compliance_corner WHERE body LIKE '%<string>%'<string>検索オブジェクトはどこにありますか)。

編集:私はVB.NETでこの関数を構築していますが、それは皆さんが貢献した構文に影響を与えますか?

また、SQL Serverで次のステートメントを実行しました:SELECT * FROM compliance_corner WHERE (body LIKE '%max%') OR (title LIKE%max% ') `そしてそれは結果を返します。

回答:


78

Visual Basicコードは、次のようになります。

Dim cmd as New SqlCommand("SELECT * FROM compliance_corner WHERE (body LIKE '%' + @query + '%') OR (title LIKE '%' + @query + '%')")

cmd.Parameters.Add("@query", searchString)

3
Adamが彼の回答で指摘しているように、これはSQLインジェクションから保護しません。クエリはパラメータ化する必要があります。
DOK

6
これがSQLインジェクションを妨げない例を提供できますか?私のテストから、それはうまく機能します
ジョン

27
それはSQL注射に開かれていません、ただLIKE注射です。これにより、ユーザーは以下のような特殊文字を入力することができることを意味% ^して_いるLIKE特別に解釈します。これは、ユーザーが特定の検索で期待するものを取得できない可能性があることを意味します。例として、を検索'less than 1% fat'すると結果が返される場合があり'less than 1% of doctors recommend this - it's full of fat!'ます。
Alex Humphrey

1
私は同意します、そのようなものは「注射のように」の対象であり、害はユーザーだけが彼らが期待するものを手に入れられないことです。クエリサニテーションは、パラメータ化されている場合でも常に実行する必要があります。その保護だけに依存することは、正確に安全ではありません。
アンソニーメイソン

1
またsearchString.Replace("[","[[]").Replace("%","[%]").Replace("_","[_]")、(エスケープ句を使用していない限り)LIKEインジェクションを無効にすることをお勧めします。
8DX 2017年

114

まあ、私は一緒に行きます:

 Dim cmd as New SqlCommand(
 "SELECT * FROM compliance_corner"_
  + " WHERE (body LIKE @query )"_ 
  + " OR (title LIKE @query)")

 cmd.Parameters.Add("@query", "%" +searchString +"%")

これは正しいです、ジョンによって提供された受け入れられた答えは間違った構文を持っています!
アダム

3
彼の構文がどのように間違っているのかわかりません。彼のソリューションは問題なく機能しました。データテーブルなどで使用するSQLステートメントを作成して返す関数があります。
アンダース

1
追記:MySQLDataAdapter = da = new MySQLDataAdapter( "SELECT * FROM tableA WHERE fieldA = @fieldA");を使用したC#の構文 da.SelectCommand.Parameters.AddWithValue( "@ fieldA"、 "%" + someValue + "%");
ジョンM

3
他の答え(ジョンから)も機能しますが、実際に同様の注入に対して脆弱であり、フィールドの目的によっては奇妙な結果をもたらす可能性があります。
Steven Lemmens 2012

1
すべきではないcmd.Parameters.AddとなりcmdLoad.Parameters.AddWithValueまたはいずれかの問題がありますか?ジェームズの答えは2008年のものだと理解しています:)
WTFZane 2017


2

%記号をパラメータと連結する必要がある場合があります。例:

LIKE '%' || @query || '%'

編集:実際には、それはまったく意味がないかもしれません。私はあなたの問題を誤解したかもしれないと思います。


1

%VBからクエリを実行する場合、MS SQL / Accessからクエリを実行する場合と、プレースホルダーとして使用されるシンボルが同じでない場合があります。プレースホルダー記号をから%に変更してみてください*。それはうまくいくかもしれません。
ただし、デバッグし、SQL文字列をMS SQLまたはAccessで直接コピーしてテストする場合は%、実際に値を返すために、シンボルをMSSQLまたはAccessで元に戻す必要がある場合があります。

お役に立てれば


2012年の時点ではわかりませんが、この%vs *はADOvsDAOエンジンに固有のものです。DAOを使用している場合、またはAccessでCurrent()を使用している場合、ワイルドカードは*です。Access内のVBAを含む任意のコードからADOを使用する場合、ワイルドカードは%です。
Marcelo ScofanoDiniz20年

1

この方法も試してください

Dim cmd as New SqlCommand("SELECT * FROM compliance_corner WHERE (body LIKE CONCAT('%',@query,'%')  OR  title LIKE CONCAT('%',@query,'%') )")
cmd.Parameters.Add("@query", searchString)
cmd.ExecuteNonQuery()

+の代わりにConcatを使用

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.