有効なsqliteクエリを作成するPythonスクリプトを作成しようとしています。SQLインジェクションを避けたいので、使用できません'%s'
。クエリを実行する方法を見つけましcursor.execute('sql ?', (param))
たが、解析されたを取得する方法が必要ですsql param
。最後に実行されたクエリを取得するために最初にクエリを実行する必要がある場合は、問題ありません。
4 に答える
パラメータの置換だけでなく、SQLの完全な構築が必要な場合は、自分の側で文字列操作を使用してそれを行う必要があります。置換は?
常に値を表します。内部的には、SQL文字列はSQLite独自のバイトコードにコンパイルされ(生成されるものを確認できますEXPLAIN thesql
)?
、値スタックの正しい場所に値を格納するだけで置換が行われます。クエリを構造的に変更するには異なるバイトコードが必要になるため、値を置き換えるだけでは不十分です。
はい、これはあなたが非常に注意しなければならないことを意味します。更新を許可したくない場合は、読み取り専用モードでDB接続を開いてみてください。
データベースへの変更を別のコンピューターに送信しようとしている場合、なぜそれらをSQL文字列として表現する必要があるのでしょうか。クエリ文字列とパラメータをタプルとしてピクルスにし、他のマシンでもSQLiteパラメータ化を使用してデータベースにクエリを実行してみませんか?
DB-APIのパラメーター置換を使用します。値を使用する場所にプレースホルダーとして配置し、カーソルのメソッド?
の2番目の引数として値のタプルを指定します。execute()
# Never do this -- insecure!
symbol = 'hello'
c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)
# Do this instead
t = (symbol,)
c.execute('SELECT * FROM stocks WHERE symbol=?', t)
print c.fetchone()
詳細については、マニュアルを参照してください。
解析された「sqlparam」を取得する方法が必要です。
すべてオープンソースであるため、解析/サニタイズを実行するコードに完全にアクセスできます。このコードを読んで、それがどのように機能するか、そして再利用できる(おそらく文書化されていない)実装があるかどうかを調べてみませんか?