Обратите внимание на форматирование запроса:
'INSERT INTO prisoners (name, lattitude, longitude, resistance) VALUES ("{0}", {1}, {2}, "{3}")'.format(shmork[0], shmork[1], shmork[2], shmork[3])
Здесь вы вставляете аргументы в запрос, используя format
. Это не избегает аргументов и, следовательно, допускает инъекцию SQL. Давайте воспользуемся более простым примером:
'INSERT INTO example (name) VALUES ("{0}")'.format(name)
Если значение name
равно Bob
, окончательное значение запроса будет:
INSERT INTO example (name) VALUES ("Bob")
Это небезопасно. Если, например, значение name
равно Bob"); DROP TABLE example--
(или что-то подобное на основе диалекта SQL), окончательное значение запроса будет
INSERT INTO example (name) VALUES ("Bob"); DROP TABLE example;--")
При этом Bob
вставляется в базу данных как обычно, но затем добавляется новый запрос для удаления всей таблицы. Затем мы используем --
, чтобы закомментировать оставшуюся часть строки.
Чтобы решить эту проблему, мы должны экранировать ввод. Вместо форматирования строк мы должны создать запрос следующим образом:
db.execute('INSERT INTO example (name) VALUES (?)', [name]);
Это приведет к правильной дезинфекции ввода и его можно будет безопасно запустить.