2013-12-09 18 views
9

レイマー入力が直接SQLクエリに挿入された場合、アプリケーションは、次の例のように、SQLインジェクションに対して脆弱になる:PYTHON-DJANGOでSQLインジェクションを防止するにはどうすればよいですか?

dinossauro = request.GET['username'] 

sql = "SELECT * FROM user_contacts WHERE username = '%s';" % username 

テーブルまたは何かを削除する - クエリを作る:

INSERT INTO table (column) VALUES('`**`value'); DROP TABLE table;--`**`') 

これを防ぐにはどうすればよいですか? Django Docsから

+3

djangoモデルを使用するのではなく、なぜSQLクエリを手作業で書くのですか? – smeso

+2

'raw'と' extra'の外にあるdjangoのORMはあなたのためにあなたの問い合わせをエスケープします。 [security docs](https://docs.djangoproject.com/ja/dev/topics/security/#sql-injection-protection)を参照してください。 – jonafato

答えて

3

SQLインジェクション保護

SQLインジェクションは 悪意のあるユーザーがデータベース上の任意のSQLコードを実行することができる攻撃の種類です。 これにより、レコードが削除されるか、データが漏洩する可能性があります。

Djangoのクエリセットを使用すると、結果のSQLは、基礎となるデータベースドライバによって正しく にエスケープされます。しかし、Djangoは の開発者にrawクエリを書いたり、カスタムSQLを実行する権限を与えています。これらの 機能は控えめに使用する必要があります。ユーザーが制御できるすべてのパラメータを適切にエスケープするには、常に に注意する必要があります。 では、extra()を使用するときは注意が必要です。

7

まず、Django ORMを使用すると、SQL注入の可能性がなくなります。

何らかの理由であなたがそれを望めない、またはしたくない場合は、Python Database APIを使用してください。ここでは、通常のDjangoでそれを行う方法です。

from django.db import connection 

cursor = connection.cursor() 
cursor.execute('insert into table (column) values (%s)', (dinosaur,)) 
cursor.close() 

あなたはまた、定型を減らすためにhandyのpythonパッケージを使用することができます。

from handy.db import do_sql 

do_sql('insert into table (column) values (%s)', (dinosaur,)) 
2

あなたは.extra()に構文を使用している場合は、次のとおりです。

YourModel.objects.extra(where=['title LIKE %s'], params=['%123%321%']) 

this answerここから繰り返すと、これは見つけるのが難しく、docs"you should always be careful to properly escape any parameters"となります。 ay どうすればを適切にエスケープするのですか?

関連する問題