13

我试图让 exec 在 Windows 服务器上工作并收到错误消息“无法分叉”。在谷歌上搜索了一下这个问题之后,似乎推荐的修复方法是授予 IUSR 帐户对 c:\Windows\System32\cmd.exe 的 READ 和 EXECUTE 权限。

但这一定是一个重大的安全漏洞,对吧?安全吗?是否有另一种方法来执行 [from php] 驻留在服务器上的 exe?

4

2 回答 2

18

它需要执行 cmd.exe 因为当 Windows PHP 看到这个时:

exec("foo -bar -baz");

它称之为:

cmd /c foo -bar -baz

如果您让用户输入参数,这只是一个安全漏洞。IE,你不应该这样做:

// DO NOT DO THIS!
exec("foo -bar=" . $_GET['bar']);

相反,您应该使用escapeshellarg清理您的参数。

// This is okay.  (Be sure foo.exe can handle unexpected input!)
exec("foo -bar=" . escapeshellarg($_GET['bar']));
于 2009-08-18T17:30:54.763 回答
1

您应该记住的一件事是,在 Windows 下创建进程会比在 Unix 类操作系统上产生更多开销。如果您有大量用户,重复调用exec()可能会导致服务器瘫痪。如果您预计服务器上的负载会很重,您可能需要考虑让工作进程作为Windows 服务持续运行

于 2009-08-18T18:10:33.217 回答