在python

时间:2017-06-26 03:56:11

标签: python sqlite

我一直在阅读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查询中的参数?

1 个答案:

答案 0 :(得分:0)

您可以使用绑定变量来参数化。您无法参数化列名(或表名,或其他SQL对象的名称)。

对这些名称使用不受信任的数据将天生不安全 - 而且,使这成为可能会阻止预先分析(可以使用哪些索引或者如何有效地执行查询) ,这是准备好的陈述中与安全无关的好处。