如何清理用户给出的列表理解?

时间:2014-10-05 21:50:28

标签: python regex simulation list-comprehension sanitization

我正在开发一个模拟器接口,这对于喜欢命令行到GUI的人来说是友好的。为了给模拟器提供级别,用户将信息键入文件,然后对其进行解析并生成设计点,然后将设计点发送到主服务器。

我希望能够实现某种"范围"功能,以便用户不需要输入所有单个级别。比简单的添加剂序列需要更多的功率。由于解析器和相关代码已经在Python中,这似乎是列表推导的完美用例。但是,列表理解是用户输入,并不保证有效。使用eval似乎太危险了,literal_eval不支持列表推导。

我目前的目标是使这样的事情变得有效和安全:

{"Factor 1": [1,2,3,7,8],
"Factor 2": "[2**x for x in range(5,20) if (x % 3) == 0]"}

用户键入的文件的基本格式是JSON。我希望扩展语言以具有其他功能(如range)以满足各种用户需求。 "数据集1"可以在现有系统中解析。列表理解将在用户的机器上进行评估,因此像'x'*9**999999**99999这样的简单攻击是自毁的。

使用正则表达式清理range函数似乎相对容易,但我不确定如何确保其他部分是安全的。正则表达式是否足以完成此任务,或者我应该遵循另一种方法吗?

1 个答案:

答案 0 :(得分:0)

进一步的分析似乎表明eval在这里比平常更危险。解析全部在客户端完成,项目代码是开源的。因此,用户通过利用eval可以做的任何恶意攻击都是自我毁灭性的,或者通过较少复杂的方法实现。因此,我可以使用eval生成级别列表。

当然,由于" eval是邪恶的,我将不得不大量记录这个决定;用火杀死它"大多数人(包括我自己)对其使用的反应。