Безопасен ли string.Template

Создаю приложение на Python, в котором можно будет использовать переменные в некоторых строках. Безопасно ли использовать для этого объект из стандартной библиотеки string.Template (https://docs.python.org/3/library/string.html#template-strings), при условии, что и строка, и спосок переменных поступают от пользователя напрямую (в данном случае под безопасностью понимается защита от атак, подобных SSTI)?

Иными словами, безопасен ли подобный код:

import string

template_str = input("Введите строку: ")
variables = {}
while True:
    name = input("Введите имя переменной (оставить пустым для отмены): ")
    if not name.strip():
        break
    value = input("Введите значение переменной: ")
    name, value = map(lambda s: s.strip(), [name, value])
    if name in variables.keys():
        print("Такая переменная уже существует")
    else:
        variables.update({name: value})

t = string.Template(template_str)
res = t.substitute(variables)
print(res)

Примечание: Вопрос заключается в том, безопасен ли сам процесс использования string.Template, если пользователь может контролировть строку, имена и значения переменных, а не в том, что дальше будет происходить с строкой.


Ответы (1 шт):

Автор решения: Evgenii Evstafev

Хотя string.Template сам по себе безопасен от SSTI, если вы используете результат (res) в web-контексте (например, отображаете его на HTML-странице) без экранирования, то пользователь может внедрить вредоносный HTML/JavaScript через значения переменных.

Например:

  1. Пользователь вводит template_str = "Привет, $name!" и для переменной name вводит значение <script>alert('XSS')</script>.
  2. res будет содержать "Привет, <script>alert('XSS')</script>!".
  3. Если это res вставить напрямую в HTML, скрипт выполнится в браузере другого пользователя.

Одно из возможных решений - это экранировать вывод, предназначенный для HTML (например, с помощью html.escape() из стандартной библиотеки), или используйте фреймворки/шаблонизаторы, которые делают это автоматически (но тогда вы вернетесь к риску SSTI, если используете мощный шаблонизатор с небезопасными настройками).

Кроме этого, теоретически, пользователь может предоставить очень большую строку шаблона или огромное количество переменных, что может привести к чрезмерному потреблению памяти или процессорного времени. Это менее вероятно, чем SSTI или XSS, но тем не менее стоит учитывать ограничения на размер ввода.

→ Ссылка