首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python子句参数化

Python子句参数化
EN

Stack Overflow用户
提问于 2022-06-13 04:46:28
回答 1查看 47关注 0票数 0

我有两个不同的数据库,它们没有链接。我需要使用数据库A的值过滤来自数据库B的数据。

这是我的表数据库A,表filter_data

代码语言:javascript
复制
| Filter    | Value    |
| Commodity | CPU      |
| Commodity | GPU      |

数据库B,表forecast_data

代码语言:javascript
复制
| Commodity | Value    |
| CPU       | 100      |
| GPU       | 200      |
| HDD       | 300      |
| SSD       | 400      |

所以我想要实现的是这样的

代码语言:javascript
复制
SELECT * FROM forecast_data WHERE Commodity IN (SELECT Value FROM filter_data)

但是由于它们位于不同的数据库中,无法链接,所以我需要从数据库A“导出”商品列表,形成SQL语句,然后在数据库B中执行它。

代码语言:javascript
复制
SELECT * FROM forecast_data WHERE Commodity IN (%s)

但是,将从数据库A导出的数据公开到SQL注入

我的Python代码,使用psycopg2:

代码语言:javascript
复制
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注入

代码语言:javascript
复制
src_sql = "SELECT * FROM forecast_data WHERE Commodity IN (%s)" % (commodity_text)

如何以一种安全的方式替换这个?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-13 06:45:02

由于您使用的是psycopg2,所以您应该使用将参数传递给查询的机制;这将为您处理任何必要的引用。任何其他值其salt的DB库都应该具有类似的机制。

(在本例中,您可以在列表中使用=ANY构造,也可以转换为元组并使用IN。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72597859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档