2016-10-11 11 views
1

私はPython用のsqlite3を使っています。式のパラメータバインディングが機能しないのはなぜですか:SQLiteのパラメータバインディングが機能しませんPRAGMA table_info

self.cursor.execute("PRAGMA table_info(?)", table_name) 

期待どおりですか?他のSELECTクエリの場合は、期待通りに自分のパラメータが置き換えられます。今使用している

self.cursor.execute("PRAGMA table_info('%s')" % table_name) 

しかし、これはSQLインジェクションに対して安全ではありません。どうすればこの問題を解決できますか?

答えて

0

私は同じことをしたいと思っていましたが、それはit's not possible to bind parameters to Sqlite PRAGMAsのように見えます。あなたは安全な滞在する何ができるか(と私は自分自身をやって終わるかもしれないもの)

はそうのようなSQLでquery all the table names in the current Sqlite databaseにある:

SELECT * FROM sqlite_master 

または、単にテーブルを取得し、意見を無視し、実行します。

SELECT * FROM sqlite_master where type="table" 

これらのテーブル名を配列/リスト/セットに格納します。これで、db内のすべてのテーブルのリストが得られました。ユーザー入力をチェックして、配列内のテーブルの1つと一致するかどうかを確認するだけです。そうであれば、文字列に直接挿入するのが安全で、SQLインジェクションの機会はありません。基本的には、ホワイトリストに対して消毒されています。

if table_name in tables: 
    self.cursor.execute("PRAGMA table_info('%s')" % table_name) 
else: 
    print("Bad table name: %s" % table_name) 
:Pythonで

、それはこのようになります。

関連する問題