我正在创建一个 Python 应用程序,它允许我在某些行中使用变量。假设字符串和变量列表都是由用户直接提供的(在这种情况下,安全意味着防止 SSTI 等攻击),那么使用标准库对象string.Template
(https://docs.python.org/3/library/string.html#template-strings )是否安全?
换句话说,这样的代码是否安全:
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
而不是接下来字符串会发生什么。