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;--`**`')
これを防ぐにはどうすればよいですか?
最初に、おそらく 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,))
Django Docs から:
SQLインジェクション保護
SQLインジェクションは、悪意のあるユーザーがデータベースで任意のSQLコードを実行できる攻撃の一種です。これにより、レコードが削除されたり、データが漏洩したりする可能性があります。
Djangoのクエリセットを使用することにより、結果のSQLは基礎となるデータベースドライバーによって適切にエスケープされます。ただし、Djangoは、生のクエリを記述したり、カスタムSQLを実行したりする能力も開発者に与えます。これらの機能は慎重に使用する必要があり、ユーザーが制御できるパラメーターを適切にエスケープするように常に注意する必要があります。さらに、 、extra()を使用するときは注意が必要です。
.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と言うことを続けないでください!