математические функции будут состоять из цифровых символов и знаков пунктуации, возможно, «E» или «e», если вы разрешите научную запись для рациональных чисел, и единственное (другое) законное использование буквенных символов будет, если вы разрешите / предоставите определенные математические вычисленияфункции (например, stddev).Таким образом, должно быть тривиально бегать по строке для буквенных символов и проверять, что следующий бит не является подозрительным, а затем просто оценивать строку в блоке try / Кроме.
Перечитайте комментарии, полученные в этом ответе... Я согласен, что этот подход играет с огнем.Тем не менее, это не значит, что это не может быть сделано безопасно.Я новичок в Python (<2 месяца), так что, возможно, не знаю обходных путей, к которым это уязвимо (и, конечно, новая версия Python всегда может сделать код небезопасным в будущем), но - насколько это мало (главным образом, мое собственное развлечение) - вот мой недостаток: </p>
def evalMaths(s):
i = 0
while i < len(s):
while s[i].isalpha() and i < len(s):
idn += s[i]
i += 1
if (idn and idn != 'e' and idn != 'abs' and idn != 'round'):
raise Exception("you naughty boy: don't " + repr(idn))
else:
i += 1
return eval(s)
Мне было бы очень интересно услышать, если / как это можно обойти ... (^_^) Кстати, я знаю, что вы можете позвонитьфункции, такие как abs2783 или _983 - если они существуют, но они не будут.Я имею в виду что-то практическое.
На самом деле, если кто-то сможет это сделать, я создам вопрос с 200 щедротами и приму их ответ.