Существует ли правильный способ безопасного использования параметров с помощью SQL-инъекции с помощью Python-клиента InfluxDB, очень похожий на функцию mogrify в psycopg?
Существует ли правильный способ безопасного использования параметров с помощью SQL-инъекции с помощью Python-клиента InfluxDB, очень похожий на функцию mogrify в psycopg?
Следующее кажется довольно опасным:
def mogrify(query, params):
return query % tuple(params)
Что, если что-то подобное было сделано:
query = """ SELECT foo FROM bar WHERE baz = %s AND bat = %s """
params = ('safe_param', 'not_so_safe_param; DROP MEASUREMENT bar;')
result_set = client.query(mogrify(query, params))
return result_set
(Не уверен, что это действительно сработает, но вы понимаете, в чем дело)
В настоящее время я рассматриваю простое собственное решение:
def mogrify(query, params):
clean_params = list()
for param in params:
param = ''.join(char for char in param if char.isalnum() or char in ('-', '_', '.'))
clean_params.append(param)
return query % tuple(clean_params)
Он удаляет все, что не является (английской) буквой, числом, подчеркиванием, простым дефисом или точкой. Основано на следующем ответе: /questions/21455227/udalit-vse-spetsialnyie-simvolyi-znaki-prepinaniya-i-probelyi-iz-stroki/21455248#21455248
Я думаю, что это покроет мои варианты использования, но я понятия не имею, существуют ли опасные угловые случаи, которые позволяют причинить вред. Для записи, пользователь, который выполняет эти запросы, имеет только доступ на чтение. Однако я бы предпочел не полагаться на этот факт. Может быть, кто-то может дать пользователю повышенные права в будущем.
Я думаю, что это будет безопасно, но я должен делать что-то еще? Это скорее похоже на один из тех случаев, когда люди будут говорить мне не запускать мою собственную вещь, как с шифрованием и хэшированием.
1 ответ
В проекте существует открытый вопрос соответствия PEP 249, и поиск репо на github ничего не дает paramstyle
так что, вероятно, сейчас нет правильного пути.