在受控条件下使用“exec”是否存在安全威胁?

5

这里是一个示例类:

from datetime import datetime
class Article:
    published = datetime.now()
    for propname in "year month day hour minute second".split():
        exec "%s = property(lambda self: self.published.%s)"%(propname, propname)
    del propname

从您所看到的内容可以发现,我正在使用exec来优化创建多个property()对象的过程。我经常读到说使用exec是不好的,并且它会成为程序中的安全漏洞。那么在这种情况下,是吗?

2个回答

6
在这种情况下,它并不是真正的安全威胁,因为安全威胁会在执行的字符串是用户具有任何类型访问权限时出现。在这种情况下,它是一个分割字符串字面量。
然而,即使它不是安全风险,使用exec几乎总是一个不好的选择。为什么不使用getattrsetattr呢?
from datetime import datetime
class Article:
    published = datetime.now()

    def __init__(self):
        for propname in "year month day hour minute second".split():
            setattr(self, propname, getattr(self.published, propname))

一个缺点是这必须在__init__方法中完成,所以它取决于您是否有足够好的理由不将其包含在其中。


3
赞同这个观点。几乎总有一个替代方案可以取代eval()exec() - Li-aung Yip
可以很容易地在类装饰器中添加类属性而不是实例属性。 - agf

0

在可信数据的情况下使用exec是可以的;然而,在这种情况下并不必要,而且会减慢您的脚本速度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接