Я читал это Django do c: https://docs.djangoproject.com/en/3.0/topics/db/sql/#executing -custom- sql -прямо
В нем объясняется, как использовать параметры для предотвращения SQL - Инъекции и документация также имеют дело только с параметрами, которые в действительном sql могут стать одинарными кавычками.
Django простые экранирования с одинарными кавычками с помощью:
self.baz = "test"
cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
становится:
b"UPDATE bar SET foo = 1 WHERE baz = 'test'"
Это показывает, что мы не можем использовать аргумент param для ключевых идентификаторов, таких как имена таблиц:
cursor.execute("SELECT %s FROM %s", [column, table])
, так как одинарные кавычки недопустимы sql запрос (обратные метки будут действительными):
b"SELECT 'id' FROM 'atablename'"
Это означает, что мы можем просто передавать данные с форматированием строки, например:
cursor.execute(f"SELECT {} FROM {}".format(column, table))
cursor.execute("SELECT "+column+" FROM "+ table)
Таким образом, мы должны заботиться о sql -инъекциях.
Есть ли что-то, чего мне не хватает?
Как я могу избежать ключевых идентификаторов в Django, чтобы не было возможности sql -инъекции?