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, который будет корректно очищать ваши запросы.
Что бы вы ни делали, не делайте интерполяцию строк.
Вы должны связать свои параметры! Полное руководство с примерами и решениями вы можете найти здесь: