[英]SQLAlchemy: Dynamically pass schema and table name avoiding SQL Injection
如何在函数中传递模式和表名的情况下执行 SQL 查询? 像下面这样的?
def get(engine, schema: str, table: str):
query = text("select * from :schema.:table")
result = engine.connect().execute(query, schema=schema, table=table)
return result
这里发生了两件事:
第一个问题的范围非常广泛,您可能想查看有关 SQLAlchemy 和 SQL 注入的旧问题,例如SQLAlchemy + SQL 注入
您的第二个问题可以通过多种方式解决,但我建议使用 SQLAlchemy 文档中的以下方法: https : //docs.sqlalchemy.org/en/13/dialects/postgresql.html#remote-schema-table-introspection -and-postgresql-search-path
PostgreSQL 支持“搜索路径”命令,它为事务中的所有操作设置模式。
因此,您的查询代码可能如下所示:
qry_str = f"SET search_path TO {schema}";
或者,如果您使用 SQLAlchemy 声明式方法,则可以使用 MetaData 对象,如此问题/答案SQLAlchemy support of Postgres Schemas
您可以在数据库中创建现有表和架构名称的集合,并在创建查询之前根据这些值检查输入:
-- assumes we are connected to the correct *database*
SELECT table_schema, table_name
FROM information_schema.tables;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.