为了账号安全,请及时绑定邮箱和手机立即绑定

为什么要避免exec()和val()?

为什么要避免exec()和val()?

子衿沉夜 2019-06-21 16:09:42
为什么要避免exec()和val()?我在多个地方见过多次这种情况,但对于为什么会出现这种情况,我从未找到令人满意的解释。所以,希望这里能有一个。为什么我们应该(至少,一般地)不使用exec()和eval()?编辑:我看到人们认为这个问题与web服务器有关-它不相关。我能理解为什么一个未经消毒的字符串被传递给exec可能很糟糕。在非网络应用程序中不好吗?
查看完整描述

3 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

Eval()和exec()可以促进延迟编程。更重要的是,它表明正在执行的代码可能没有在设计时编写,因此没有经过测试。换句话说,如何测试动态生成的代码?尤其是跨浏览器。


查看完整回答
反对 回复 2019-06-21
?
弑天下

TA贡献1818条经验 获得超8个赞

通常有更清晰、更直接的方法来达到同样的效果。如果您构建了一个复杂的字符串并将其传递给exec,那么代码就很难遵循,也很难测试。

示例:我编写了读取字符串键和值的代码,并在对象中设置了相应的字段。看起来是这样的:

for key, val in values:
    fieldName = valueToFieldName[key]
    fieldType = fieldNameToType[fieldName]
    if fieldType is int:
        s = 'object.%s = int(%s)' % (fieldName, fieldType) 
    #Many clauses like this...exec(s)

对于简单的情况来说,这段代码并不可怕,但是随着新类型的出现,它变得越来越复杂。当出现bug时,它们总是在调用exec时触发,所以堆栈跟踪无法帮助我找到它们。最后,我转向了一个稍微长一些、不那么聪明的版本,它显式地设置了每个字段。

代码清晰的第一条规则是,您的代码的每一行都应该很容易理解,只需查看它附近的行。这就是为什么不鼓励Goto和全局变量。执政官和伊娃让人很容易违反这条规则。


查看完整回答
反对 回复 2019-06-21
?
皈依舞

TA贡献1851条经验 获得超3个赞

当你需要主管和艾娃的时候,是的,你真的需要他们。

但是,这些函数的大部分非常规使用(以及其他脚本语言中类似的构造)是完全不合适的,可以用其他更快、更安全和更少bug的更简单的构造来代替。

你,你们能,会,可以,使用适当的转义和过滤,安全地使用exec和val。但是,那种直接求助于exec/val来解决问题的编码器(因为他们不了解该语言提供的其他工具)并不是那种能够正确处理的编码器;它将是那些不懂字符串处理和盲目连接子串的人,导致了脆弱的不安全代码。

这是弦乐的诱惑。抛出字符串段相貌容易,愚蠢,天真,编码者认为他们知道他们在做什么。但经验表明,在某个角落(或不那么拐角处)的情况下,结果几乎总是错误的,往往带有潜在的安全隐患。这就是为什么我们说伊娃是邪恶的。这就是为什么我们说HTML的正则表达式是邪恶的。这就是我们推动SQL参数化的原因。是的,你能,会,可以用手工处理字符串来处理所有这些事情.但除非你已经明白我们为什么要说那些话,否则你很有可能不会.


查看完整回答
反对 回复 2019-06-21
  • 3 回答
  • 0 关注
  • 402 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信