Как безопасно создать базу данных SQLite3 с именем переменной - PullRequest
1 голос
/ 22 мая 2019

это код, который я хотел бы иметь, где мне не нужно точно указывать переменную 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 Ответ

1 голос
/ 22 мая 2019

Если thisworks предоставлено пользователем, существует риск случайного внедрения SQL-символов или символов, которые не являются допустимыми в качестве идентификаторов SQLite.

Обычно в реляционном дизайне, добавлении таблиц или столбцов дляконкретный пользовательский ввод немного нахмурился.Обычно лучшим вариантом является использование одной таблицы и просто наличие столбца, который содержит переменную thisworks.Потому что, в конце концов, select test from {thisworks} - это примерно то же самое, что и select test from userdata where label = ?, param = {thisworks}, но это намного безопаснее в отношении инъекций, и нет риска взрыва вашей базы данных из-за того, что она содержит базилион таблиц.При этом, SQLite, в частности, поддерживает 2 миллиарда таблиц в одном файле, так что вы можете сойти с рук.

Если вы это сделаете, обязательно отфильтруйте предоставленную переменную, лучше всего сбелый список, как только допускается az.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...