如何限制表达式eval()或exec()可以运行?

时间:2012-09-25 03:42:56

标签: python parsing

所以我正在尝试创建一个类似于集合理论计算器的Python应用程序(即两个集合,交集,补集等)。我希望有一个文本字段,在执行时,像Python表达式一样进行评估,使用大括号并将其全部转换为集合。计算新集时,结果将打印在屏幕上。但是,我想确保用户不会输入任何可能会破坏整个应用程序(或更糟糕的系统)的Python命令,无论是否有意。他应该只能输入以下内容;

  • 设置操作(联合,差异,基数等;我将提供数学符号的按钮,并使用正则表达式使其在引擎盖下正确)
  • 集合(反过来,它只能包含以下元素;其他集合,元组,整数,实数,字母字符和字符串)。

为了给你一个想法,这就是输入和输出应该是什么样的(这个应用程序将使用GUI,我只是为了方便而使用终端样式):

>>> {1, 2, a} - {a}
{1, 2}

任何提示?或者我应该实现一种迷你语言,我将其变成Python命令?

2 个答案:

答案 0 :(得分:1)

首先

Compile表达式,然后walk the resultant AST验证它只包含您明确要允许的操作。 然后 evaluate它。

答案 1 :(得分:0)

我会使用你可以翻译成python命令的迷你语言。

如果要使用{}表示法表示集合,则只需确保括号中包含的每个非数字值都被视为字符串(以避免安全风险)。嵌套括号将被实例化为冻结集,因为集合是不可删除的,不能嵌套。

解析集之间的操作数可能应限于:

s <= t  test whether every element in s is in t
s >= t  test whether every element in t is in s
s | t   new set with elements from both s and t
s & t   new set with elements common to s and t
s - t   new set with elements in s but not in t
s ^ t   new set with elements in either s or t but not both