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

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

我在多个地方见过多次这种情况,但对于为什么会出现这种情况,我从未找到令人满意的解释。

所以,希望这里能有一个。为什么我们应该(至少,一般地)不使用exec()eval()?

编辑:我看到人们认为这个问题与web服务器有关-它不相关。我能理解为什么一个未经消毒的字符串被传递给exec可能很糟糕。在非网络应用程序中不好吗?


子衿沉夜
浏览 403回答 3
3回答

翻翻过去那场雪

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

弑天下

通常有更清晰、更直接的方法来达到同样的效果。如果您构建了一个复杂的字符串并将其传递给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和全局变量。执政官和伊娃让人很容易违反这条规则。

皈依舞

当你需要主管和艾娃的时候,是的,你真的需要他们。但是,这些函数的大部分非常规使用(以及其他脚本语言中类似的构造)是完全不合适的,可以用其他更快、更安全和更少bug的更简单的构造来代替。你,你们能,会,可以,使用适当的转义和过滤,安全地使用exec和val。但是,那种直接求助于exec/val来解决问题的编码器(因为他们不了解该语言提供的其他工具)并不是那种能够正确处理的编码器;它将是那些不懂字符串处理和盲目连接子串的人,导致了脆弱的不安全代码。这是弦乐的诱惑。抛出字符串段相貌容易,愚蠢,天真,编码者认为他们知道他们在做什么。但经验表明,在某个角落(或不那么拐角处)的情况下,结果几乎总是错误的,往往带有潜在的安全隐患。这就是为什么我们说伊娃是邪恶的。这就是为什么我们说HTML的正则表达式是邪恶的。这就是我们推动SQL参数化的原因。是的,你能,会,可以用手工处理字符串来处理所有这些事情.但除非你已经明白我们为什么要说那些话,否则你很有可能不会.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JQuery