参数绑定不适用于SQLite PRAGMA table_info

irtuqstp  于 2023-01-02  发布在  SQLite
关注(0)|答案(2)|浏览(159)

我正在使用sqlite3 for Python。为什么不使用表达式的参数绑定:

self.cursor.execute("PRAGMA table_info(?)", table_name)

对于任何其他SELECT查询,它将按预期替换我的参数。

self.cursor.execute("PRAGMA table_info('%s')" % table_name)

但是这对于SQL注入是不安全的。2我该如何解决这个问题?

pnwntuvh

pnwntuvh1#

EDIT:As of SQLite version 3.16.0 (2017-01-02), all PRAGMAS can now be used as PRAGMA functions,它应该允许参数化。
在Python中:

self.cursor.execute("SELECT * FROM pragma_table_info(?)", table_name)

(感谢Rubinium的回答指出了这一点)但是如果您使用的是SQLite的早期版本,那么我最初的回答可能是您唯一的选择。
我想做同样的事情,但它看起来像是不可能绑定参数到SqlitePRAGMA。
为了保持安全,您可以做的(我自己也可能会做)是在SQL中使用query all the table names in the current Sqlite database,如下所示:

SELECT * FROM sqlite_master

或者,要仅获取表并忽略视图,请执行以下操作:

SELECT * FROM sqlite_master where type="table"

然后将这些表名存储在一个数组/列表/集合中。现在您已经拥有了数据库中所有可能的表的列表,您可以简单地检查用户输入,看看它是否与数组中的某个表匹配。如果匹配,则可以安全地直接插入到字符串中,并且不会有SQL注入的机会。本质上,它是根据白名单进行清理的。
在Python中,它看起来像这样:

if table_name in tables:
    self.cursor.execute("PRAGMA table_info('%s')" % table_name)
else:
    print("Bad table name: %s" % table_name)
kg7wmglp

kg7wmglp2#

对于任何遇到这个问题的人来说,最佳方法是使用如下杂注函数:

self.cursor.execute("SELECT * FROM pragma_table_info(?)", table_name)

sqlite3_prepare_v2( db, "SELECT * FROM pragma_table_info(?)", -1, &stmt, &tail );
sqlite3_bind_text( stmt, 1, table_name, -1, nullptr );

相关问题