参数绑定不适用于 SQLite PRAGMA table_info
Parameter binding not working for SQLite PRAGMA table_info
我正在为 Python 使用 sqlite3。为什么表达式的参数绑定不起作用:
self.cursor.execute("PRAGMA table_info(?)", table_name)
如预期?对于任何其他 SELECT
查询,它会按预期替换我的参数。我现在用
self.cursor.execute("PRAGMA table_info('%s')" % table_name)
但这对 SQL 注入并不安全。我该如何解决这个问题?
编辑: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 的早期版本,那么我的原始答案可能是您唯一的选择。
我想做同样的事情,但似乎无法将参数绑定到 Sqlite PRAGMA。
你可以做些什么来保持安全(以及我自己最终可能会做的)是在 SQL 中 query all the table names in the current Sqlite database 像这样:
SELECT * FROM sqlite_master
或者,要仅获取 tables 并忽略视图,请执行:
SELECT * FROM sqlite_master where type="table"
然后将这些 table 名称存储在 array/list/set 中。现在您在数据库中有了所有可能的 table 的列表,您可以简单地检查用户输入以查看它是否与数组中的 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)
对于遇到这个问题的任何人,最佳方法是使用 pragma 函数,如下所示:
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 );
我正在为 Python 使用 sqlite3。为什么表达式的参数绑定不起作用:
self.cursor.execute("PRAGMA table_info(?)", table_name)
如预期?对于任何其他 SELECT
查询,它会按预期替换我的参数。我现在用
self.cursor.execute("PRAGMA table_info('%s')" % table_name)
但这对 SQL 注入并不安全。我该如何解决这个问题?
编辑: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 的早期版本,那么我的原始答案可能是您唯一的选择。
我想做同样的事情,但似乎无法将参数绑定到 Sqlite PRAGMA。
你可以做些什么来保持安全(以及我自己最终可能会做的)是在 SQL 中 query all the table names in the current Sqlite database 像这样:
SELECT * FROM sqlite_master
或者,要仅获取 tables 并忽略视图,请执行:
SELECT * FROM sqlite_master where type="table"
然后将这些 table 名称存储在 array/list/set 中。现在您在数据库中有了所有可能的 table 的列表,您可以简单地检查用户输入以查看它是否与数组中的 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)
对于遇到这个问题的任何人,最佳方法是使用 pragma 函数,如下所示:
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 );