我正在创建与游戏服务器一起使用的函数。该服务器使用插件。我有这些使用 SQLite 数据库的函数,以及 apsw 来检索另一个函数存储的项目。我对此有 3 个问题。
问题一:我不断收到错误“SQLError:near “?”:语法错误” 由于我的语句具有多个 ?
,因此很难找出到底是什么错误。那么出了什么问题呢?
问题二:我了解 SQL 注入(inject),但这些函数只接受脚本运行者的输入,而他唯一会破坏的东西就是他自己的东西。即便如此,有没有一种简单的方法可以证明 SQL 注入(inject)?
问题三:有什么办法可以让这个功能更加高效吗?
这是现在的样子:
def readdb(self,entry,column,returncolumn = "id,matbefore,matafter,name,date"):
self.memwrite
if isinstance(entry, int) or isinstance(entry, str):
statement = 'SELECT {0} FROM main WHERE {1} IN {2}'.format(returncolumn,column,entry)
self.memcursor.execute(statement)
blockinfo = self.memcursor.fetchall()
return(blockinfo)
if isinstance(entry, tuple) or isinstance(entry, list):
statement = '''SELECT {0} FROM main WHERE {1} IN (%s)'''.format(returncolumn,column)
self.memcursor.execute(statement % ("?," * len(entry))[:-1], entry)
blockinfo = self.memcursor.fetchall()
return(blockinfo
最佳答案
这很有趣(请继续阅读以了解原因)。
您的第一个语句实际上使用了 sqlite3
模块的值绑定(bind)机制(我假设这就是您使用的)。因此,*
(默认列)被转义,使得语句无效。这是 SQL 注入(inject)证明,您自己的代码会尝试注入(inject) SQL(现在看到有趣的事情了吗?)。
第二次使用 Python 字符串替换来构建查询字符串,这不是 SQL 注入(inject)证明。
关于python - 3个涉及Python和SQLite的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4114708/