@unt1tledddd

Как научить чат-бота в телеграм воспринимать буквы?

Бот в телеге при выдаче реквизитов внутри бота может принимать только цифры, то есть на любую букву вылезает ошибка, пожалуйста, помогите исправить)

#Изменение бикоин
def admin_new_bitcoin(message):
new_bitcoin = message.text
connection = sqlite3.connect('database.sqlite')
q = connection.cursor()
try:
q.execute("update config set bitcoin = " + str( new_bitcoin ) + " where id = 1")
connection.commit()
q.close()
connection.close()
bot.send_message(message.chat.id, 'Успешно!', reply_markup=keyboards.admin)
except:
bot.send_message(admin, 'Ошибка', reply_markup=keyboards.admin)
  • Вопрос задан
  • 107 просмотров
Пригласить эксперта
Ответы на вопрос 2
shurshur
@shurshur
Сисадмин, просто сисадмин...
Я пришлю тебе

'';drop table config;select bitcoin from config

И таблица config будет удалена. Это называется SQL-инъекцией.

Ты не оборачиваешь строку в кавычки, разумеется, ничего хорошего не получится. В случае цифр, конечно, запрос без кавычек выполняется успешно. Но вообще это неправильный способ использования SQL, так как любая кавычка его сломает, а тщательно подготовленный текст (пример я привёл) вообще вызовет не тот запрос, который планировался.

Правильно использовать плейсхолдеры:

q.execute("UPDATE config SET bitcoin=? WHERE id=?", (new_bitcoin, user_id))


В этом случае база данных сама правильно всё подставит и выполнит.
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
q.execute("update config set bitcoin = " + str( new_bitcoin ) + " where id = 1")

За такое надо бить по рукам. Железной линейкой. Поясню почему:
если new_bitcoin присвоить число 1234 или строку "1234", то получим запрос
update config set bitcoin = 1234 where id = 1
Этот запрос синтаксически корректен с точки зрения языка SQL.
А вот если new_bitcoin присвоить строку "foobar", получим запрос
update config set bitcoin = foobar where id = 1
С точки зрения SQL это обращение к столбцу foobar. Которого, разумеется, нету.

А теперь, внимание, вопрос: какого огурца ты не ознакомился с азами использования СУБД, а именно с синтаксисом подстановки значения?
Читай тут, начиная со слов "Instead, use the DB-API’s parameter substitution". Осознай, и больше так не делай.

Ну и до кучи: что будет, если в bitcoin будет строка вида "0; --"?
update config set bitcoin = 0; -- where id = 1
Всё, что после "--" это комментарий, и будет проигноировано. Т.е. запрос перезапишет весь столбец bitcoin нулями.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы