14

これが可能かどうか/どのように可能か疑問に思っています。可能であれば、私が理解できないように見える単純な修正だと確信しています

@SqlQuery("SELECT * FROM Table WHERE column LIKE '%:thingName%'")
public Set<Things> getThings(@Bind("thingName", String thingName)

基本的に、このおもちゃの例では、列に [任意のテキスト]thingName[任意のテキスト] が含まれる行を選択しようとしています。上記のように使用すると、引用符がバインドされた変数を覆い隠していると思うので、バインドされた変数ではなく、文字通り [any text] :thingName [anyText] を探します。

前もってありがとう、マデリーン

4

2 に答える 2

24

SQL インジェクションを回避するためにバインドされた変数を使用しながら、concat を使用して入力を % 記号で囲みます。

@SqlQuery("select * from atable where acolumn like concat('%',:thingName,'%')")
public Set getNames(@Bind("thingName") String thingName);
于 2014-07-20T07:56:30.047 に答える
13

バインドされた変数に「%」パーセンテージを追加する必要がある場合のようです。

@SqlQuery("SELECT * FROM Table WHERE column LIKE :thingName")
public Set<Things> getThings(@Bind("thingName") String thingName); // where thingName = "%" + thingName + "%"

参照: https://groups.google.com/forum/?fromgroups#!topic/jdbi/EwUi2jAEPdk

ブライアン・マッカリスターからの引用

:foo バインディングを使用すると、準備されたステートメントが作成され、この場合は name の値がバインドされます。% がバインドされた値の一部である必要があります。または、準備済みステートメントへのバインドを使用する必要はありません。

  • アプローチ1(より安全で一般的に優れた方法):「select … from foo where name like :name」と値をバインドします(「%」+ name)

  • アプローチ2(これにより、SQLインジェクションが可能になります):

"select … from foo where name like '%' " and define("name", name) (または SQL オブジェクトでは (@Define("name") name)) -- name をリテラルとしてステートメントに入れます。

重要なことは、% 文字は、ステートメントの一部ではなく、テスト対象の値の一部であるということです。

于 2013-05-31T21:37:53.040 に答える