什么时候(如果曾经)不是邪恶的?

我听说过很多 地方,PHP的eval功能通常不能解决问题。根据PHP 5.3的LSB和闭包,我们没有理由依赖eval或create_function。


有没有可能eval在PHP 5.3中有最佳(唯一?)答案的情况?


这个问题不是关于eval邪恶是否普遍存在,因为显然不是。


答案摘要:


评估数值表达式(或PHP的其他“安全”子集)

单元测试

交互式PHP“外壳”

可信赖的反序列化 var_export

一些模板语言

为管理员和/或黑客创建后门

与<PHP 5.3的兼容性

检查语法(可能不安全)


撒科打诨
浏览 372回答 3
3回答

达令说

主要的问题eval是它是恶意代码的网关。因此,永远不要在可以从外部利用它的环境中使用它,例如用户提供的输入。一个有效的UseCase将在Mocking Frameworks中。来自的例子 PHPUnit_Framework_TestCase::getMock()// ... some code before&nbsp; &nbsp; $mock = PHPUnit_Framework_MockObject_Generator::generate(&nbsp; &nbsp; &nbsp; $originalClassName,&nbsp; &nbsp; &nbsp; $methods,&nbsp; &nbsp; &nbsp; $mockClassName,&nbsp; &nbsp; &nbsp; $callOriginalClone,&nbsp; &nbsp; &nbsp; $callAutoload&nbsp; &nbsp; );&nbsp; &nbsp; if (!class_exists($mock['mockClassName'], FALSE)) {&nbsp; &nbsp; &nbsp; &nbsp; eval($mock['code']);&nbsp; &nbsp; }// ... some code after实际上,generate方法中发生了很多事情。用外行术语来说:PHPUnit将使用参数generate并从中创建一个类模板。然后eval它将使用该类模板使其可用于实例化。这样做的重点是让TestDoubles当然可以模拟UnitTests中的依赖项。

猛跑小猪

您可以使用eval创建临时类:function myAutoLoad($sClassName){&nbsp; &nbsp;# classic part&nbsp; &nbsp;if (file_exists($sClassName.'.php'){&nbsp; &nbsp; &nbsp; require $sClassName.'.php';&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; eval("&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; class $sClassName{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; public function __call($sMethod,$aArgs){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return 'No such class: ' . $sClassName;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }");&nbsp; &nbsp; }}&nbsp;尽管当然使用非常有限(某些API或DI容器,测试框架,必须处理具有动态结构的数据库的ORM,代码游乐场)
打开App,查看更多内容
随时随地看视频慕课网APP