如何安全地将参数插入 SQL 查询并获取生成的查询?



我必须使用不符合DBAPI的库来与数据库进行交互(Quboleqds_sdk)。此库仅允许发送不带参数的原始 SQL 查询。因此,我想要一种SQL注入证明的方式来将参数插入查询并在Python中获取生成的格式化查询。类似于以下示例中的format_sql函数:

sql = 'select * from table where id = ?'
formatted_sql = format_sql(sql, (123,))  # 'select * from table where id = 123'

这是否可能,还是过于特定于RDBMS?

我对 Quoble 和它接受的 SQL 方言不太了解,您可能正在处理一系列数据类型。但是在许多情况下,将参数转换为字符串,然后通过加倍或在它们前面加上反斜杠来转义单引号字符(例如,MySQL 允许这两种方法),这可能是你能做的最好的事情。我会使用%s作为您的伪准备语句的占位符:

from datetime import date
def format_sql(query, args):
new_args = []
for arg in args:
new_args.append(str(arg).replace("'", "''"))
return query.replace("%s", "'%s'") % tuple(new_args)
print(format_sql("insert into mytable(x, y, z) values(%s, %s, %s)", ("Booboo's car", date.today(), 2)))

指纹:

insert into mytable(x, y, z) values('Booboo''s car', '2021-01-04', '2')

如果%s有可能出现在 SQL 中的某些上下文中,而不是作为占位符,那么您需要将单引号放在那些实际占位符的出现周围,并且没有执行该功能format_sql函数:

from datetime import date
def format_sql(query, args):
new_args = []
for arg in args:
new_args.append(str(arg).replace("'", "''"))
return query % tuple(new_args)
print(format_sql("insert into mytable(x, y, z) values('%s', '%s', '%s')", ("Booboo's car", date.today(), 2)))

最新更新