8
私は、Python 2.6を経由してのSQLiteデータベースのuser_version
を変更しようとしている、と私は次の操作を実行しようとしました:PRAGMAでsqlite3パラメータ置換を使用できませんか?
cur.execute("PRAGMA user_version = ?" , (version,))
それは次のエラーで失敗します。
cur.execute("PRAGMA user_version = ?" , (version,))
sqlite3.OperationalError: near "?": syntax error
私は疑問符の代わりに名前付きのスタイルを試しましたが、同じエラーで失敗します。
SQL文字列の一部として数値をドロップするか、Pythonの文字列演算を使用しても、すべて正常に動作しますが、どちらかを実行しないでください。
なぜこれが機能しないのですか?
そして、この呼び出しに変数から数値を安全に挿入するにはどうすればよいですか?
私はそう思っていました。では、どうすれば値を安全に挿入できますか?唯一の内部的な使用法が単純な文字列の連結またはPythonの許容範囲内であればここで受け入れられますか? – DMA57361
これは、パラメータが整数の場合に制限を処理する良い方法です。他のプラグマのパラメータが代わりに文字列だった場合、フォーマットを確認する必要はありません(たとえば7のような整数は "7"として有効です)が、SQL注入を避けるためにパラメータをエスケープする必要があります。それを行う便利な方法はありますか? – spaaarky21
@ spaaarky21:私はsqlite3がマニュアルクォートを提供するために提供されている機能を認識していません。文字列を受け入れる他のプラグマについては、許容される入力のホワイトリストを列挙し、この入力に対してユーザー入力をチェックするのが最も安全な方法でしょう。 – unutbu