タイトルが示すように、このコードがSQLインジェクションに対して脆弱かどうか知りたいですか?もしそうなら、同じことを達成するためのより良い、より安全な方法はありますか?
def add(table,*args):
statement="INSERT INTO %s VALUES %s" % (table,args)
cursor.execute(statement)
はい、そうです。それを防ぐために次のようなものを使用してください:
cursor.execute("INSERT INTO table VALUES ?", args)
このようにテーブルに入ることができないことに注意してください。理想的には、テーブルはハードコーディングされている必要があります。いかなる状況でも、いかなる種類のユーザー入力からもテーブルが取得されてはなりません。テーブルに対して行ったのと同様の文字列を使用できますが、ユーザーがなんらかの方法で変更できないことを100%確認することをお勧めします...「sqlite3でテーブル名のパラメーターを使用できますか? 」を参照してください。詳細については。
基本的に、データデータベースを安全にするために、カーソルコマンドにパラメータを配置する必要があります。table
最初のコマンドを使用すると、特別なものを作成したりargs
、SQLコードに安全ではないものを追加したりするのは比較的簡単です。Pythonページ、および参照されているhttp://xkcd.com/327/を参照してください。具体的には、Pythonページは次のように引用しています。
通常、SQL操作ではPython変数の値を使用する必要があります。安全ではないため、Pythonの文字列操作を使用してクエリをアセンブルしないでください。これにより、プログラムがSQLインジェクション攻撃に対して脆弱になります(問題が発生する可能性のあるユーモラスな例については、http: //xkcd.com/327/を参照してください)。
代わりに、DB-APIのパラメーター置換を使用してください。置く ?値を使用する場所のプレースホルダーとして使用し、カーソルのexecute()メソッドの2番目の引数として値のタプルを指定します。(他のデータベースモジュールは、%sや:1などの異なるプレースホルダーを使用する場合があります。)
基本的に、誰かが次のような別のコマンドを実行する引数を設定できます。
args="name; DELETE table"
cursor.executeを使用すると、指定された値が詰め込まれ、引数がリストされたとおりになるようになります。引数に対してクエリを実行すると、まさにそれが得られます。XKCDはこれもユーモラスに説明しています。