繁体   English   中英

SQLAlchemy:动态传递架构和表名,避免 SQL 注入

[英]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

这里发生了两件事:

  1. 避免 SQL 注入
  2. 使用(大概)PostgreSQL 动态设置模式

第一个问题的范围非常广泛,您可能想查看有关 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM