3

SQLクエリでプレースホルダーonを''で囲むことで置き換えるときはいつでも、これを防ぐ方法はありますか?

それは私が次のようなことをすることができないことを意味します

SQL("SELECT * FROM {table} blah").on("table" -> tabletouse) 

これは、テーブル名が''でラップされているため、SQL構文エラーが発生するためです。

4

2 に答える 2

4

エスケープしたくないデータのフォーマット関数を使用して、両方のアプローチを確実に組み合わせることができます

SQL(
  """
    select %s from %s
    where
      name = {name} and
      date between {start} and {end}
    order by %s
  """.format(fields, table, order)
).on(
  'name     -> name,
  'start    -> startDate,
  'end      -> endDate
)

format関数を使用して送信するデータは、ユーザー入力からのものであってはならないことを考慮に入れてください。そうでない場合は、適切にサニタイズする必要があります。

于 2012-07-30T14:53:08.267 に答える
1

あなたがしようとしていることをすることはできません。Anormの置き換えは、PreparedStatementsに基づいています。つまり、すべてのデータが自動的にエスケープされます。つまり、次の代わりに置換を使用することはできません。

  • テーブル名、
  • 列名、
  • オペランド、SQLキーワードなど。

ここでできる最善のことは、文字列の連結です(そして、私の意見では本当に悪い方法です):

SQL("SELECT * FROM " + tabletouse + " blah").as(whatever *)

PS:PreparedStatementsのテーブル名に関するこの質問をチェックしてください。

于 2012-07-30T12:54:31.767 に答える