Я разрабатываю веб-приложение, которое взаимодействует с Databricks с помощью SQL-коннектора Databricks. Приложение позволяет пользователям из разных команд добавлять/переименовывать/удалять столбцы существующих таблиц. Информация о столбце принимается в виде параметров HTTP. Сник начал поднимать вопрос об уязвимости внедрения SQL-кода, поскольку в первоначальной версии мы передавали параметры в запрос через стиль строки формата. Чтобы решить эту проблему, мы попытались использовать IDENTIFIER() для имени схемы/таблицы, но то же самое не работает с именами столбцов в команде ALTER, UPDATE. Вы можете обратиться к этому сообщению в блоге
https://community.databricks.com/t5/tec ... ba-p/82167
Вот соответствующая часть моего кода:
Код: Выделить всё
def add_config(self, user_name, action, schema_name, table_name, field_names, field_datatypes):
alter_query = "ALTER TABLE IDENTIFIER(:sch || '.' || :tab) ADD COLUMNS ({})".format(columns_str)
cursor.execute(alter_query, {'sch': schema_name,'tab': table_name})
self.conn.commit()
Я также реализовал базовую проверку ввода безопасных идентификаторов:
Код: Выделить всё
def is_safe_identifier(self, identifier):
return re.match(r'^[a-zA-Z0-9_]+$', identifier) is not None
Это необходимо для обеспечения очистки входных данных для параметров http.
Как я могу изменить свой код, чтобы добиться разрешения SQL-инъекции, одновременно реализуя реализуемую функцию (динамическое добавление столбцов)? Не могу придумать никакого другого метода, кроме строки формата.
Подробнее здесь:
https://stackoverflow.com/questions/795 ... in-databri