【发布时间】:2017-06-26 03:56:11
【问题描述】:
我一直在阅读 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查询中填写参数?
【问题讨论】:
-
stackoverflow.com/questions/610056/… 询问 Oracle 的基本问题,但答案对所有健全的 SQL 数据库都是正确的。 (另外,stackoverflow.com/questions/9723931/…)
-
...另外,stackoverflow.com/questions/3135973/… 为 MySQL 提出了同样的问题(并得到了同样的答案)。