这是我想要的代码,在数据库创建过程中不必完全指定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 (?)")

最佳答案

如果用户提供了thisworks,则存在随机SQL注入或其中不合法作为SQLite标识符的字符的风险。

通常,在关系设计中,为特定用户输入添加表或列有点烦恼。通常,一个更好的设计是使用单个表,并且只保留一个包含变量thisworks的列。因为最后,select test from {thisworks}大约与
select test from userdata where label = ?, param = {thisworks},但是在注入方面更安全,并且由于包含大量表格而不会导致数据库崩溃的风险。话虽这么说,SQLite专门在一个文件中supports 2 billion tables,所以您可能会摆脱它。

如果这样做,请确保过滤提供的变量,最好使用白名单,例如仅允许a-z。

10-06 03:23