【问题标题】:How do I sanitize a list comprehension given by a user?如何清理用户给出的列表理解?
【发布时间】:2014-11-30 04:51:06
【问题描述】:

我正在为模拟器开发一个界面,该界面旨在对喜欢命令行而不是 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 函数似乎相对容易,但我不确定如何确保其他部分是安全的。正则表达式是否足以完成这项任务,还是我应该遵循另一种方法?

【问题讨论】:

  • 您写的问题有点令人困惑-您是否在本地计算机上评估 Python 代码,并将结果发送到服务器?还是将代码发送到服务器,让服务器完成繁重的工作?
  • 看起来像python代码,用户输入python代码吗?如果是这样,它必须由 python 解析器解析。通常,您不会让用户输入要评估的代码。
  • 它并不干净,但如果您希望用户插入简单的列表推导,如果它们执行过多,您可以阻止它们:link
  • @sln 列表理解本身不是 Python 代码。我使用这种结构是因为我的用户很熟悉它,而且我希望它易于解析。
  • @CraigOtis 用户键入的文件指定模拟的因素和水平。客户端机器将完成生成设计点的工作,然后将其发送到服务器。模拟本身发生在服务器上。

标签: python regex simulation list-comprehension sanitization


【解决方案1】:

进一步的分析似乎表明eval 在这里没有平时那么危险。解析全部在客户端完成,项目代码开源。因此,用户可以通过利用eval 进行的任何恶意行为要么是自毁的,要么可能通过不那么复杂的方法进行。因此,我可以只使用eval 来生成级别列表。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多