我一直在阅读sqlite的文档,并发现许多来源强烈建议在查询中避免使用python字符串替换,因为它会使它们容易受到注入攻击:
避免:
conn.execute("SELECT * FROM %s" % table_name)
conn.execute("SELECT * FROM {}".format(table_name))
我已经看过几个简单的例子,其中像这样的字符串格式被替换为slqlite参数:
values = ('my_table', '1')
conn.execute("SELECT * FROM ? WHERE ROWID = ?", values)
这适用于简单的情况,但是当我想从列表中检索参数值时失败,如下例所示:
使用字符串格式的工作代码:
c.execute("BEGIN TRANSACTION")
for i in range(len(amt_l)):
c.execute("""
INSERT INTO transactions ({}, {}, {}, {}, {})
VALUES ('{}', '{}', '{}', '{}', '{}')
""".format(header[0], header[1], header[2], header[3], header[4],
date_l[i], party_l[i], direction_l[i], ctr_party_l[i], amt_l[i]))
db.commit()
使用参数的非工作代码:
c.execute("BEGIN TRANSACTION")
for i in range(len(amt_l)):
values = (header[0], header[1], header[2], header[3], header[4],
date_l[i], party_l[i], direction_l[i], ctr_party_l[i], amt_l[i])
c.execute("""
INSERT INTO transactions (?, ?, ?, ?, ?)
VALUES (?, ?, ?, ?, ?)
""", values)
当从列表中检索参数值时,有没有办法使用?
来填充sql查询中的参数?
答案 0 :(得分:0)
您可以使用绑定变量来参数化值。您无法参数化列名(或表名,或其他SQL对象的名称)。
对这些名称使用不受信任的数据将天生不安全 - 而且,使这成为可能会阻止预先分析(可以使用哪些索引或者如何有效地执行查询) ,这是准备好的陈述中与安全无关的好处。