@likeviolence

Есть ли разница между написаниями?

Есть ил разница между этими примерами? Просто не могу найти информацию про sql иньекцию и защиту
sql = "UPDATE data SET inventory = %s WHERE id = %s"
	val = (inventory - 1, id)
	cursor.execute(sql, val)


cursor.execute("UPDATE data SET inventory = {inventory - 1} WHERE id = {id}")
  • Вопрос задан
  • 129 просмотров
Решения вопроса 1
Amoralny
@Amoralny
Python-разработчик
Когда вводишь данные, ставь их в "", тогда SQL будет читать их как строки.
UPDATE data SET inventory = "{inventory}" WHERE id = "id";

И даже если вставить вместо id какой-то код для изменения базы, то SQL будет искать что-то типа:
... id="6346327; DROP DATABASE base";

Еще в cursor() есть свой ввод данных
cursor.execute("UPDATE data SET inventory = :inventory WHERE id = :id", {"inventory" : inventory-1, "id" : id})
#или
cursor.execute("UPDATE data SET inventory = ? WHERE id = ?", (inventory-1, id))


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

ps. не юзай root пользователя для запросов :D
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@deliro
Агрессивное программирование
Ну подставь id="1; DELETE FROM data" и сразу увидишь:)
Ответ написан
@Yuribtr
Разницы нет, оба примеры уязвимы.
Ответ написан
ThunderCat
@ThunderCat
{PHP, MySql, HTML, JS, CSS} developer
В первом варианте просто будет ошибка, если inventory у вас числовое поле. Во втором случае возможна инъекция, как указал вам Roman Kitaev. Гуглите подготовленные выражения в питоне. Единственно не вижу конфигурации подключения к бд, в ней дожно быть прописаноcursor = connection.cursor(prepared=True), но емнип без этого и магия первого запроса не будет работать вообще...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы