SQLAlchemy + MySQL - передать имя таблицы как параметр в необработанном запросе - PullRequest
2 голосов
/ 06 августа 2020

В своем приложении я использую SQLAlchemy и mysql -connector- python. Я хотел бы выполнить такой запрос SELECT * FROM :table LIMIT 10 в своей базе mysql. Однако мой код не работает

table_name = "tmp1"
QUERY = "SELECT * FROM :table LIMIT 10"
conn = create_sql_connection()
res = conn.execute(
    QUERY,
    {'table': table_name}
).fetchall()
print(res)

Я читал, что вы не можете использовать имя таблицы в качестве параметра, и мне нужно просто использовать формат строки python. Однако меня очень пугает, что это абсолютно небезопасно от инъекции sql. Как это решить? Есть ли какая-нибудь утилита, которая избегает моей переменной имени таблицы?

Postgres имеет решение - Передача имени таблицы в качестве параметра в psycopg2 - Вы знаете, как решить эту проблему при использовании mysql?

Ответы [ 2 ]

2 голосов
/ 07 августа 2020

вы можете передать предоставленную пользователем строку в оператор Table и построить запросы из этого: (здесь я предполагаю, что вы получаете данные пользователя из почтового запроса json)

table_name_string = request.get_json().get('table')
selected_table = db.Table(table_name_string, metadata, autoload=True)
query = selected_table.select()

вы также можете go при использовании этого запроса как необработанной строки sql на этом этапе, если вы действительно хотите

query_string = str(query)

некоторую проверку ввода или ограничения, какие таблицы являются действительными, определенно рекомендуется, но это sql безопасная инъекция, так как таблица должна существовать в метаданных, иначе будет выдано исключение (sqlalchemy.ex c .NoSuchTableError:)

2 голосов
/ 06 августа 2020

Вы можете добавить список разрешенных таблиц:

allowed_tables = ["tmp1", "tmp2", ...]
if table in allowed_tables:
    # do sth. useful here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...