如何安全地创建一个变量名的SQLite3数据库

时间:2019-05-21 21:27:52

标签: python sqlite

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

1 个答案:

答案 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。