gpt4 book ai didi

python - 如何将 PostgreSQL 的查询附加到 Python 3 中的另一个查询并防止 SQL 注入(inject)?

转载 作者:行者123 更新时间:2023-12-04 10:06:20 24 4
gpt4 key购买 nike

我正在用 Python 3 编写一些脚本,需要从 PostgreSQL 数据库中读取数据。在一个场景中,我需要将一个查询附加到另一个查询并防止 SQL 注入(inject)。我尝试了不同的方法(格式字符串,sql.SQL),但没有成功。下面是我使用的代码:

data = {
'id': 14,
'user_id': (16, 'Administrator'),
'from_date': datetime.datetime(2019, 1, 6, 5, 45, 15),
'to_date': datetime.datetime(2020, 5, 3, 5, 45, 15),
'state': 'to_be_review',
'language': 'english',
}
query = " AND hr.unit_identification_code_id IN (%s)" % ','.join(map(str, uic_ids))
user_id = data.get('user_id') and data.get('user_id')[0] or 0
if uic_ids:
if data.get('state') != 'reject_submit':
self._cr.execute(sql.SQL("""
SELECT
elh.id
FROM
employee_log_history elh
LEFT JOIN
hr_employee hr
ON elh.hr_employee_id = hr.id
WHERE
elh.create_date >= %s
AND elh.create_date <=%s
AND elh.create_uid = %s
AND elh.state = %s {}
""").format(sql.Identifier(query)), (data.get('from_date'), data.get('to_date'), user_id, data.get('state'),)
)

但是当我运行脚本作为结果时,我得到双引号中的第一个查询并出现以下错误:
psycopg2.ProgrammingError: syntax error at or near "" AND hr.unit_identification_code_id IN (33,34,35,36,37,38,39,40,41,42,49,47,60,61,63,64,62,43,46,58,59,50,57,48,44,51,52)""
LINE 13: ... AND elh.state = 'to_be_review' " AND hr.u...

现在我想知道是否可以执行此查询并防止 SQL 注入(inject)并在第二个查询中附加第一个查询?

最佳答案

sql.Identifier用于引用标识符,例如表名或列名,而不是用于调整 SQL block 。做你想做的事,使用sql.SQL .

这是一个简化的示例,向 WHERE 添加附加条件条款:

import psycopg2
from psycopg2 import sql

conn = psycopg2.connect(database='test')
cur = conn.cursor()

stmt1 = "SELECT name, password FROM users WHERE name = %s"
stmt2 = ' AND {} = %s'

composed = sql.SQL(stmt2).format('password')

print(composed)
Composed([SQL(' AND '), Identifier('password'), SQL(' = %s')])

print(repr(composed.as_string(cur)))
' AND "password" = %s'

cur.mogrify(stmt1 + composed.as_string(cur), ('Alice', 'secret'))
b'SELECT name, password FROM users WHERE name = \'Alice\' AND "password" = \'secret\''

混合字符串( stmt )和对象( composed )感觉有点老套。您可能希望在代码中始终如一地使用对象,但这取决于您。

关于python - 如何将 PostgreSQL 的查询附加到 Python 3 中的另一个查询并防止 SQL 注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61571331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com