如何在Python中安全地操作用户代码?

时间:2016-05-08 00:47:21

标签: python string function sorting

例如,如果我要制作一个程序,该程序将排序算法作为输入并根据经验确定算法是否部分正确,我将如何将字符串输入转换为可执行程序?我已经阅读了使用exec或eval建议的其他线程,但由于安全风险,建议不要使用此方法。有没有办法创建这样一个程序,不涉及将字符串转换为可执行代码?或者无论实施如何,它本身都是一个有风险的计划吗?最后,是否有另一种编程语言可以更好地替代定义这样的程序?

1 个答案:

答案 0 :(得分:1)

执行任意代码

无论您选择何种语言,如果您从用户那里读取代码并执行该代码,那将是危险的。没有ifs,ands或buts。你注意到Python的exec和eval也有同样的注意事项,JavascriptPHP和许多其他语言都有注意。

从字符串安全执行代码

将字符串映射到预定义函数有安全的方法,但没有安全的方法来编译/解释和执行任意代码。

以下是关于如何将函数安全地映射到字符串的一个很好的例子:

functions = {
    'print': print,
    'str': str,
    'int': int
}

name = input('Choose from the above functions here')
functions.get(name)()

静态代码分析

对于最终答案,可能但不是,因为有评估排序算法的方法,但是如果不编译代码或至少解释它们,它们就不可能有效,可重现或准确。静态代码分析很困难,而且只能到目前为止。

使用单个if语句进行静态代码分析有多困难的一个简单示例如下:

for index, value in enumerate(range(10)):
    if index and value - old == 1:
        print(value)
     old = value

一些执行静态代码分析的库认为此代码会引发错误(例如Pylint),因为old是在首次使用后定义的,但是,因为bool(0)会评估为了假,old实际上只在第一个循环之后检查过,在它已经定义之后,所以代码运行没有问题。

考虑输入的复杂性,输出的复杂性以及可能的排序算法的变化数量,这些变量都是等价的。测试代码的最简单方法是运行它。动态代码分析存在局限性,但是对于给定的输入,然后将其与所需的输出进行比较,您可以很好地了解代码是否正常工作,而这仅仅是静态分析非常困难。