Django, если я использую сырой SQL, какие шаги я должен предпринять, чтобы избежать атак внедрения SQL?

Я читал, что ORM должен минимизировать возможности атак с использованием SQL-инъекций. Однако в Django иногда ORM несколько ограничен, и мне нужно использовать сырой SQL. Какие шаги следует предпринять, чтобы избежать атак с использованием SQL-инъекций?

В настоящее время я знаю, проверять точки с запятой в строке запроса, но не более того. Если я использую параметризованные запросы, решит ли это проблему? Есть ли библиотеки для передачи строки, которая проверит это для меня?

2 ответа

Решение

В документации говорится следующее:

Если вам нужно выполнить параметризованные запросы, вы можете использовать аргумент params для raw():

>>> lname = 'Doe'
>>> Person.objects.raw('SELECT * FROM myapp_person WHERE last_name = %s', [lname])

params список или словарь параметров Вы будете использовать %s заполнители в строке запроса для списка, или %(key)s заполнители для словаря (где ключ заменяется ключом словаря, конечно), независимо от вашей базы данных. Такие заполнители будут заменены параметрами из аргумента params.

Это также стандартный способ передачи параметров с использованием DB-API Python, который будет корректно очищать ваши запросы.

Что бы вы ни делали, не делайте интерполяцию строк.

Вы должны связать свои параметры! Полное руководство с примерами и решениями вы можете найти здесь:

http://www.djangobook.com/en/2.0/chapter20.html

Другие вопросы по тегам