这是我想要的代码,在数据库创建过程中不必精确指定howtodothis
变量。我希望它是动态的。
class DbHandler():
def __init__(self, howtodothis):
self.database = sqlite3.connect('api_data.db')
self.cursor = self.database.cursor()
self.cursor.execute("CREATE TABLE IF NOT EXISTS ? (test)",(howtodothis,))
def insert(self):
self.cursor.execute("INSERT INTO ? VALUES (?)",(howtodothis,))
我现在有这个,但是我想知道它是否安全
class DbHandler():
def __init__(self, thisworks):
self.database = sqlite3.connect('api_data.db')
self.cursor = self.database.cursor()
self.cursor.execute(f"CREATE TABLE IF NOT EXISTS {thisworks} (test)")
def insert(self):
self.cursor.execute(f"INSERT INTO {thisworks} VALUES (?)")
答案 0 :(得分:1)
如果用户提供了thisworks
,则存在随机SQL注入或其中的SQLite标识符不合法的字符的风险。
通常在关系设计中,为特定用户输入添加表或列有点烦恼。通常,一个更好的设计是使用一个表,并且只保留一个包含变量thisworks
的列。因为最后,select test from {thisworks}
与
select test from userdata where label = ?, param = {thisworks}
,但在注入方面更为安全,而且由于包含了海量的表,因此不会出现数据库崩溃的风险。话虽这么说,SQLite专门将supports 2 billion tables放在一个文件中,所以您可以摆脱它。
如果这样做,请确保过滤提供的变量,最好使用白名单,例如仅允许a-z。