1] Exec() 在以下情况下非常有用:
A)想要在 php 没有等效命令的服务器上运行程序/实用程序。例如 ffmpeg 是通过 exec 调用运行的通用实用程序(用于各种媒体转换)。
B)运行另一个进程 - 你可以阻止或不阻止 - 这是非常强大的。有时您可以使用 pcnt_fork 或类似的方法以及正确的 CL args 来实现非阻塞。
C) 另一个例子是当我必须处理 XSLT 2.0 时 - 我必须 exec() 我运行的一个小型 Java 服务来处理转换。非常便利。PHP 不支持 XSLT 2.0 转换。
2]该死的,这是一个耻辱。嗯,方法很多。有一个称为“远程文件包含漏洞”的漏洞系列,基本上允许攻击者包含任意源并因此在您的服务器上执行它。看看: http: //lwn.net/Articles/203904/
另外,上面提到过,说你在做类似的事情(非常简化):
exec("someUnixUtility -f $_GET['arg1']");
好吧,想象一下攻击者做了,url.come?arg1="blah;rm -rf /",你的代码基本上可以归结为:
exec("someUnixUtility -f blah; rm -rf /");
在 unix 中,您使用 ; 分隔命令 所以是的 - 这可能会造成很大的伤害。
与文件上传相同,假设您剥离最后四个字符 (.ext) 以查找扩展名。好吧,像“exploit.php.gif”这样的东西怎么样,然后你去掉扩展,所以你有exploit.php,你把它移到你的/users/imgs/文件夹中。好吧,攻击者现在所要做的就是浏览到 users/imgs/exploit.php 并且他们可以运行他们想要的任何代码。那时你已经拥有了。