证明这个PHP函数的评估是危险的


Prove this PHP Eval of Function Dangerous

我正在查看下面的代码块,但找不到在这种特定情况下eval如何危险的工作示例。

我意识到eval是危险的,永远不会被使用,总有更好的方法可以做到这一点,等等,但出于我自己的好奇心,我想定义这个代码块是如何危险的。

在下面的情况下,$z的值由用户控制,但是单引号的(据我所知,因此不能分解另一个变量)。在$z内部应用单引号来打断字符串是不可能的。

function bar($x) {
    echo $x;
}
$z = 'USER CONTROLLED INPUT';
eval("bar('$z);");

好吧,if你忘了逃离$z,那么你有人总是可以做这样的事情:

$z = '); unlink('/files/importantfile.data');

在您的情况下,它没有任何问题,只是有可能忘记逃跑!

这一切都是关于代码和数据的分离:程序员编写程序代码来指导解释器如何行为以及如何处理数据。代码是主动方,数据是被动方。

现在像eval这样的函数在这两个库之间建立了一座桥梁,并允许像程序代码一样评估数据。

这不是一个问题,直到应该被解释为代码的数据可以被程序员以外的人操纵,例如,一个不应该改变程序行为的用户。因为在这种情况下,用户将拥有与程序员相同的权力。

您的代码现在可能是安全的。但是,一个微小的更改可能会将其变成一个严重的安全漏洞,允许您网站的任何用户在您的服务器上执行任意的PHP代码:

注意eval()语言构造非常危险,因为它允许执行任意PHP代码<因此不鼓励使用它>如果您已经仔细验证了除了使用此构造之外没有其他选择,请特别注意在未事先正确验证的情况下,不要将任何用户提供的数据传递到其中。

当你使用eval时,你走的边缘太窄了,你不应该尝试在上面走。