我正在使用sqlite3 for Python。为什么不使用表达式的参数绑定:
self.cursor.execute("PRAGMA table_info(?)", table_name)
对于任何其他SELECT查询,它将按预期替换我的参数。
SELECT
self.cursor.execute("PRAGMA table_info('%s')" % table_name)
但是这对于SQL注入是不安全的。2我该如何解决这个问题?
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)
kg7wmglp2#
对于任何遇到这个问题的人来说,最佳方法是使用如下杂注函数:
或
sqlite3_prepare_v2( db, "SELECT * FROM pragma_table_info(?)", -1, &stmt, &tail ); sqlite3_bind_text( stmt, 1, table_name, -1, nullptr );
2条答案
按热度按时间pnwntuvh1#
EDIT:As of SQLite version 3.16.0 (2017-01-02), all PRAGMAS can now be used as PRAGMA functions,它应该允许参数化。
在Python中:
(感谢Rubinium的回答指出了这一点)但是如果您使用的是SQLite的早期版本,那么我最初的回答可能是您唯一的选择。
我想做同样的事情,但它看起来像是不可能绑定参数到SqlitePRAGMA。
为了保持安全,您可以做的(我自己也可能会做)是在SQL中使用query all the table names in the current Sqlite database,如下所示:
或者,要仅获取表并忽略视图,请执行以下操作:
然后将这些表名存储在一个数组/列表/集合中。现在您已经拥有了数据库中所有可能的表的列表,您可以简单地检查用户输入,看看它是否与数组中的某个表匹配。如果匹配,则可以安全地直接插入到字符串中,并且不会有SQL注入的机会。本质上,它是根据白名单进行清理的。
在Python中,它看起来像这样:
kg7wmglp2#
对于任何遇到这个问题的人来说,最佳方法是使用如下杂注函数:
或