我有两个不同的数据库,它们没有链接。我需要使用数据库A的值过滤来自数据库B的数据。
这是我的表数据库A,表filter_data
| Filter | Value |
| Commodity | CPU |
| Commodity | GPU |数据库B,表forecast_data
| Commodity | Value |
| CPU | 100 |
| GPU | 200 |
| HDD | 300 |
| SSD | 400 |所以我想要实现的是这样的
SELECT * FROM forecast_data WHERE Commodity IN (SELECT Value FROM filter_data)但是由于它们位于不同的数据库中,无法链接,所以我需要从数据库A“导出”商品列表,形成SQL语句,然后在数据库B中执行它。
SELECT * FROM forecast_data WHERE Commodity IN (%s)但是,将从数据库A导出的数据公开到SQL注入
我的Python代码,使用psycopg2:
def select_command_postgres_no_argument(conn, sql):
with conn.cursor() as cur:
cur = conn.cursor()
cur.execute(sql)
return cur.fetchall()
def select_command_postgres_with_argument(conn, sql, sql_args = ()):
with conn.cursor() as cur:
cur = conn.cursor()
cur.execute(sql, sql_args)
return cur.fetchall()
# Retrieve the list of commodities
commodity_records = select_command_postgres_no_argument(postgres_conn, "SELECT Value FROM filter_data")
commodity = []
for row in commodity_records:
commodity.append(row[0])
commodity_text = ', '.join(f"'{w}'" for w in commodity)
src_sql = "SELECT * FROM forecast_data WHERE Commodity IN (%s)" % (commodity_text)恐怕这会导致SQL注入
src_sql = "SELECT * FROM forecast_data WHERE Commodity IN (%s)" % (commodity_text)如何以一种安全的方式替换这个?
发布于 2022-06-13 06:45:02
由于您使用的是psycopg2,所以您应该使用将参数传递给查询的机制;这将为您处理任何必要的引用。任何其他值其salt的DB库都应该具有类似的机制。
(在本例中,您可以在列表中使用=ANY构造,也可以转换为元组并使用IN。)
https://stackoverflow.com/questions/72597859
复制相似问题