Как я могу предотвратить SQL-инъекцию в PYTHON-DJANGO?

Если вход ламера вставляется непосредственно в SQL-запрос, приложение становится уязвимым для SQL-инъекции, как в следующем примере:

dinossauro = request.GET['username']

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

Чтобы удалить таблицы или что-нибудь еще - сделав запрос:

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

Что можно сделать, чтобы предотвратить это?

Ответ 1

Во-первых, вы, вероятно, должны просто использовать 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%'])

Повторяя здесь этот ответ, поскольку это трудно найти, а docs, которые говорят "you should always be careful to properly escape any parameters", не говорят, как правильно их избежать!

Ответ 3

Из Django Docs:

Защита от SQL-инъекций

SQL-инъекция - это тип атаки, где злоумышленник может выполнить произвольный код SQL в базе данных. Это может привести к удалению записей или утечке данных.

Используя Djangos-запросы, результирующий SQL будет правильно экранированный базовым драйвером базы данных. Однако, Django также дает разработчики могут писать необработанные запросы или выполнять пользовательский sql. Эти возможности следует использовать экономно, и вы всегда должны быть осторожны для правильного удаления любых параметров, которые пользователь может контролировать. В Кроме того, вы должны проявлять осторожность при использовании дополнительных().