Проблема
Когда вы используете f-strings для SQL:
query = f"SELECT * FROM users WHERE name = '{user_input}'"
пользовательский ввод напрямую попадает в запрос.
Если злоумышленник передаст:
admin'; DROP TABLE users; --
— база выполнит вредоносную команду.
Это классическая SQL injection.
Почему это неудобно сейчас
Безопасный способ — параметризованные запросы:
cursor.execute(
"SELECT * FROM users WHERE name = %s",
(user_input,)
)
Но приходится:
• запускать шаблон отдельно
• передавать значения отдельно
• поддерживать две структуры
Что изменилось в Python 3.14
Появились template string literals (t-strings).
В отличие от f-strings, они:
• не возвращают готовую строку
• возвращают объект Template
• отдельно хранят текст и подставленные значения
Пример:
query = t"SELECT * FROM users WHERE name = {user_input}"
Теперь можно:
• получить все интерполяции
• проверить значения
• экранировать или валидировать их
• и только потом собрать финальный SQL
safe = safe_sql(query)
Результат:
• вредоносный ввод очищается
• SQL-инъекции блокируются
• таблицы остаются на месте
Почему это важно
f-strings - быстрые, но опасные для SQL.
t-strings позволяют сохранить удобство шаблонов и добавить контроль безопасности.
Python движется к безопасным шаблонам по умолчанию, меньше ручной защиты, меньше уязвимостей в продакшене.
