pysqliteを使用する私はいくつかのデータで何かをするための手続きをしています。操作の同じ種類を複数のテーブルと列に類似したフィールドで行われたので、私は、以下のように私は、SQLステートメントをパラメータ化することができると思っている:pysqlite:列またはテーブル名のプレースホルダ置換?
def foo():
column = 'c'
table = 't'
row = 1
# preferred approach, gives syntax error
c.execute('SELECT ? FROM ? WHERE id=?', (column, table, row))
# sanity check, works fine
c.execute('SELECT c FROM t WHERE id=?', (row))
# workaround, also works, but is this the right way?
c.execute('SELECT % FROM % WHERE id=?' % (column, table), row))
私が手にエラーが(sqlite3.OperationalError: near "?": syntax error
)非常に有用ではありませんが、Iポイントを得る:Pysqliteはこの方法でプレースホルダを使用することに感謝しない。
上記を行う適切な方法に沿って、ここで何が起こっているのか誰かが指摘できますか?
これはSQLインジェクションから安全ですか? – berkelem
@berkelem:SQLインジェクションに脆弱です。残念ながら、列名と表名はパラメータ化できないため、文字列の書式設定を避ける方法はありません。 [ホワイトリストを使用する](https://phpdelusions.net/sql_injection#whitelist)がベストプラクティスです。 – unutbu