web-dev-qa-db-ja.com

PYTHON-DJANGOでSQLインジェクションを防ぐにはどうすればよいですか?

Lamer入力がSQLクエリに直接挿入されると、次の例のように、アプリケーションはSQLインジェクションに対して脆弱になります。

dinossauro = request.GET['username']

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

テーブルなどを削除するには、クエリを作成します。

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

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

16
Jayron Soares

最初に、おそらく 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,))
10
Suor

Django Docs から:

SQLインジェクション保護

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

Djangoのクエリセットを使用することにより、結果のSQLは基礎となるデータベースドライバーによって適切にエスケープされます。ただし、Djangoは、生のクエリを記述したり、カスタムSQLを実行したりする能力も開発者に与えます。これらの機能は慎重に使用する必要があり、ユーザーが制御できるパラメーターを適切にエスケープするように常に注意する必要があります。さらに、 、extra()を使用するときは注意が必要です。

5
cstrutton

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

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

これを this answer から繰り返すのは、これを見つけるのは難しいためであり、- docs"you should always be careful to properly escape any parameters"それらを適切にエスケープするためにhowと言うことを続けないでください!

3
Chris