2012-11-28 6 views
9

タイトルが示唆するように、このコードがSQLインジェクションに対して脆弱かどうかを知りたいですか?もしそうなら、より良い、より安全な、同じことを達成する方法がありますか?このPythonコードはSQLインジェクションに対して脆弱ですか? (SQLite3)

def add(table,*args): 
    statement="INSERT INTO %s VALUES %s" % (table,args) 
    cursor.execute(statement) 
+1

私はあなたにSQLインジェクションが何であるかをお読みになることをお勧めします。それは非常に明確にすべきです。 –

答えて

21

はい、あります。

cursor.execute("INSERT INTO table VALUES ?", args) 

このように表を入力することはできません。理想的には、テーブルはハードコードされている必要があります。テーブルの場合と同様の文字列を使用することができますが、ユーザーが何らかの形でそれを変更できないことを100%確実にすることをお勧めします。詳細はCan I use parameters for the table name in sqlite3?を参照してください。

本質的に、パラメータをカーソルコマンドに入れることは、データデータベースを安全にするためです。あなたの最初のコマンドでは、安全でないSQLコードに何かを入れた特別なtableまたはargsを作るのは比較的簡単です。 python pagesおよび参照先http://xkcd.com/327/を参照してください。具体的には、Pythonのページを引用:

Usually your SQL operations will need to use values from Python variables. You shouldn’t assemble your query using Python’s string operations because doing so is insecure; it makes your program vulnerable to an SQL injection attack (see http://xkcd.com/327/ for humorous example of what can go wrong).

Instead, use the DB-API’s parameter substitution. Put ? as a placeholder wherever you want to use a value, and then provide a tuple of values as the second argument to the cursor’s execute() method. (Other database modules may use a different placeholder, such as %s or :1.)

を基本的には、誰かが、別のコマンドを実行引数を設定することができ、このような何か:cursor.executeを使用して

args="name; DELETE table" 

ように、与えられた値を詰め込むます引数はリストされているようにすることができ、クエリを実行すると、それはまさにあなたが出すものです。 XKCDもこのことをユーモラスに説明しています。

enter image description here

+0

ありがとうございます。あなたはなぜそれが脆弱であるかについて少し拡大できますか? – Sheldon

+1

静かなことかもしれませんが、安全であることが必要です。これは、INSERTだけでなく、すべてのステートメントで行います。 SELECT文も同様に脆弱です。 –

+0

@PearsonArtPhoto私は "TypeError:関数は最大2つの引数(3与えられます)を取得" – Sheldon

関連する問題