我工作的一个PHP项目,我希望运行的代码,是牵强从MySQL数据库。有没有被注入的不安全代码的机会,所以我很担心的唯一的事情是服务表现。我应该使用eval(),所以我可以直接运行该代码,或解析它,以便call_user_func()运行它,而不是

例如,如果我取出的代码是 “MYFUNC(1,2,3); anotherFunc(3,2,1);”,点击 我可以EVAL()它直接以运行该代码。

但对于call_user_func(),我不得不分析字符串,以便它可以被运行。因此,这是在这种情况下使用的更好的功能?

有帮助吗?

解决方案

作为一般规则,我总是试图留尽量远离的eval()越好。 这种情况下,然而,看起来像一个很好的候选人了。

您说的“没有被注入的不安全代码的机会” 的,所以最大的问题是:有没有unworking代码在数据库中的机会

如果不是,EVAL()是该溶液中,但如果有则正确解析和错误记录/等可能是一个更安全的赌注。 (我相信使用call_user_func_array()在理论上是更快,因此任何解析开销可能会变得可忽略不计)

其他提示

贮藏PHP在数据库本身是一种不好的设计气味;即使在这种情况下,你非常肯定它不可能包含不安全的代码,这是一件好事,以尽量减少假设或像你必须作出抗辩的数目。如果您存储的PHP代码在数据库中,那么攻击中,攻击者能够访问你的数据库很快成为了很多比较严重,变成其中一个攻击者可以运行任意代码的攻击!我知道有你的数据库泄露这样是极不可能的,但仍然是良好的安全习惯,不要让即使是不太可能的情况危及您的系统超过它需要。

很多人都同意这中的eval()应该总是无一例外地在PHP代码避免。总有一种替代方法。

在这种情况下,但是,我认为我会说,使用eval()将是你最好的解决办法,因为你已经在数据库中存储的PHP代码,所以使用eval()是不会增加你的风险比任何进一步的说。

我想,但是,建议

  1. 您试试你EVAL之前验证码()它通过被你给多少保守。假设以某种方式攻击者钻进你的数据库甚至认为是不可能的。
  2. 您至少可以给一些认真考虑重写应用程序,以便PHP代码不会存储在数据库中。如果要存储复杂的数据结构,想想有点像JSON,甚至XML来代替。安全解析器这些存在。
  3. 我如果这个答案似乎有点反动的遗憾;我只是碰巧觉得这样的事情是非常重要的。

我认为解析会增加开销,但可以肯定的唯一途径是运行测试它。试试各种功能两种方式,看看你的结果是什么。使用代码,表示你希望存储的内容。

祝你好运!

使用的eval()。还有什么是不值得的努力 - 他们不会有任何积极的副作用

您可能想看看 runkit extention,它可以在沙箱中运行PHP不影响运行代码。

如果代码是假设影响你的运行代码,去的eval()。

您应该换你即将在try / catch块运行过的代码,如果有错误(即使你说的不会有,有一种可能性,它是最佳实践)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top