python3.3.1中sqlite3问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python3.3.1中sqlite3问题相关的知识,希望对你有一定的参考价值。

这是《集体智慧编程》里一个sqlite3测试用例:
import sqlite3
con=sqlite3.connect('test1.db')
con.execute('create table people (name,phone,city)')
con.execute('insert into people values ("toby","555-1212","Boston")')
con.commit()
cur=con.execute('select * from people')

运行后报错:sqlite3.OperationalError: unable to open database file
请问问题出在哪里?

参考技术A 可能原因有很多, 比如说你的硬盘有故障, 或者目录下面已经有了一个叫test1.db的目录, 等等

在python中使用sqlite3注入安全参数化查询[重复]

【中文标题】在python中使用sqlite3注入安全参数化查询[重复]【英文标题】:Injection safe parameterized queries with sqlite3 in python [duplicate] 【发布时间】: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查询中填写参数?

【问题讨论】:

***.com/questions/610056/… 询问 Oracle 的基本问题,但答案对所有健全的 SQL 数据库都是正确的。 (另外,***.com/questions/9723931/…) ...另外,***.com/questions/3135973/… 为 MySQL 提出了同样的问题(并得到了同样的答案)。 【参考方案1】:

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

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

【讨论】:

谢谢查尔斯。我已经编写 SQL 大约一年了,但是我对在 python 中与数据库交互还比较陌生。我是否正确理解问题不在于我从列表中的值填充参数,而是我将参数用于我不允许的东西? @Evan,完全正确。

以上是关于python3.3.1中sqlite3问题的主要内容,如果未能解决你的问题,请参考以下文章

Android TV 中缺少 sqlite3?

sqlite3:创建没有列的表

在FTP失败连接Pyth3.6中循环

IOS中的Sqlite3并发问题

无法加载 DLL 'sqlite3':在 windows phone 应用程序中。

SQLite3“忘记”使用外键