0

次のように、テーブル内の任意の列を更新しようとしています。

cursor.execute('update table set :n = :v where submitter = :s', 
               {'n':'col1', 'v': 10, 's': 'mike'})

しかし、それは私に与えますsqlite3.OperationalError: near ":n": syntax error。奇妙なことに、私が行うとうまく動作します

cursor.execute('update table set col1 = :v where submitter = :s', 
               {'n':'col1', 'v': 10, 's': 'mike'})

インジェクション保存の方法で列に名前を付けられないように見えるのはなぜですか? 任意の列を設定する他の方法はありますか?

4

2 に答える 2

4

バインドできるのはのみです。識別子(例: 列/テーブル名) およびその他の構造構文は、プレースホルダーにバインドできません。

一般に、準備されたステートメントには「既知のクエリ形状」が必要であり、動的識別子を許可するとそれが禁止されます。(これに当てはまらないデータベースやデータベース アダプターがあるかもしれませんが、私はまだ出会ったことがありません。)

于 2012-07-15T18:23:18.103 に答える
2

お気づきのように、プレースホルダーをテーブルまたは列の名前として使用することはできません。代わりに、動的テーブルまたは列名の文字列に連結する必要があります。

したがって、安全であることを確認するために、使用可能な列名のホワイトリストと照合することをお勧めします。

# Array of valid values for colname
valid_colnames = ['col1','col2','col3']
# Only do it if you received a safe known value
if colname in valid_colnames:
  cursor.execute('update table set ' + colname + ' = :v where submitter = :s', 
               {'v': 10, 's': 'mike'})
于 2012-07-15T18:24:19.230 に答える