Безопасен ли 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 шт):
Хотя string.Template сам по себе безопасен от SSTI, если вы используете результат (res) в web-контексте (например, отображаете его на HTML-странице) без экранирования, то пользователь может внедрить вредоносный HTML/JavaScript через значения переменных.
Например:
- Пользователь вводит
template_str = "Привет, $name!"и для переменнойnameвводит значение<script>alert('XSS')</script>. resбудет содержать"Привет, <script>alert('XSS')</script>!".- Если это
resвставить напрямую вHTML, скрипт выполнится в браузере другого пользователя.
Одно из возможных решений - это экранировать вывод, предназначенный для HTML (например, с помощью html.escape() из стандартной библиотеки), или используйте фреймворки/шаблонизаторы, которые делают это автоматически (но тогда вы вернетесь к риску SSTI, если используете мощный шаблонизатор с небезопасными настройками).
Кроме этого, теоретически, пользователь может предоставить очень большую строку шаблона или огромное количество переменных, что может привести к чрезмерному потреблению памяти или процессорного времени. Это менее вероятно, чем SSTI или XSS, но тем не менее стоит учитывать ограничения на размер ввода.