Чтобы избежать атак SQL инъекций, я хочу использовать переменные связывания / параметры запроса, но они, похоже, не работают для идентификаторов (например, имени таблицы или имени пользователя)
import snowflake.connector
import os
def myfunc(username):
with snowflake.connector.connect(user=os.environ['SF_USER'], password=os.environ['SF_PASSWORD'], account=os.environ['SF_ACCOUNT']) as ctx:
cs = ctx.cursor().execute('''SHOW GRANTS TO USER %s''', (username))
print(cs.rowcount)
rint(cs.fetchone())
myfunc('TEST2') # Raises a ProgrammingError: 001003 (42000): SQL compilation error: syntax error line1 at position 20 unexpected ''TEST2''
Я думаю, что в приведенном выше тесте TEST2
вставлено как буквальное 'TEST2`` and not as an identifier
"TEST2" `.
Если я не могу использовать для этого переменные связывания / параметры запроса, я думаю, мне нужно будет создать строку самостоятельно f'''SHOW GRANTS TO USER {username}'''
но какие параметры у меня есть для очистки ввода перед интерполяцией строки ?
Кстати, я знаю, что вместо SHOW GRANTS TO USER "<username>"
я мог бы использовать select * from "SNOWFLAKE"."ACCOUNT_USAGE"."GRANTS_TO_USERS" where deleted_on is null and grantee_name = '<username2'
, что позволяет избежать проблемы, поскольку в последнем запросе имя пользователя используется как буквальное, а не как идентификатор. Но я обнаружил, что SNOWFLAKE.ACCOUNT_USAGE.GRANTS_TO_USERS
отстает (НЕ показывает сразу последние изменения, в моем случае с задержкой более 20 минут).
Итак, что я могу использовать для очистки значений, которые я буду использовать в качестве идентификаторов, чтобы предотвратить атаки SQL инъекций?