我应该通过FastCGI模拟PHP吗?

我正在通过FastCGI将最新版本的PHP安装到IIS 7.5上,并且所有的说明都指出FastCGI应该通过设置来模拟调用客户端

fastcgi.impersonate = 1 

如果我的网站将有这个configuration

  • 专用应用程序池
  • ApplicationPoolIdentity的应用程序池标识
  • 仅限匿名身份validation(如IUSR)

我为什么要模仿?

我来自ASP.NET背景,IUSR获得只读权限,应用程序池标识获得任何写入权限。 给予IUSR写入权限通常会打开WebDAV漏洞的大门。 所以我不愿意让PHP像IUSR一样运行。

我找不到很多人问这个问题( 1 | 2 ),所以我觉得我必须要失去一些东西。 有人能为我澄清这个吗?

13个月后,我想重温我自己的问题。 在那段时间,我已经从IIS 6转移到IIS 7.5的半打网站,并configuration我的首选方法。 我只能说网站工作,没有任何安全问题(不是这些网站是stream行的),在我看来,这个设置比learn.iis.net的build议更安全。

为了后人,这里是相关的设置。 在PHP INI中:

 cgi.force_redirect = 0 cgi.fix_pathinfo=1 fastcgi.impersonate = 0 

在IIS中:

  • 应用程序池>标识> ApplicationPoolIdentity
  • 网站>authentication>匿名authentication>特定用户: IUSR

NTFS权限以及在哪里应用它们:

  • IUSR – 授予读取,拒绝写入
    • IIS网站的根目录。 例如,在Zend Framework项目中,这将是/ public目录。
    • 如果您的应用程序上传文件并将其保存在公用目录中,则需要将此权限应用于临时上载目录。 这是因为move_uploaded_file将保留上传目录的权限。 这是我发现的权限设置的最大缺点。
  • ApplicationPoolIdentityIISAPPPOOL\YourApplicationPoolName ) – 授予读取和列表
    • 你的PHP应用程序的根。 例如,在Zend Framework项目中,这将是整个项目。
    • 应用程序包含的任何外部库(Zend,Doctrine等)不在应用程序文件夹中。
  • ApplicationPoolIdentity – 授予修改
    • 应用程序将写入的任何位置,例如upload_tmp_dirsession.save_patherror_log
    • 有时我需要在我的开发环境中将此权限添加到PHP应用程序的根目录,以支持Doctrine自动生成代理的function 。
  • ApplicationPoolIdentity – 授予列表
    • 如果您的应用程序位于虚拟目录中,则需要将此权限添加到网站的根目录。 这使您的应用程序可以读取其父级web.config。 例如,如果您的应用程序根目录是http://example.com/MYPHPApp ,请在example.com Web目录上设置此权限。 具体而言,您只需要应用“此文件夹和文件”,“仅在此容器内”。

我希望这有助于任何决定learn.iis.net说明不理想的人。

请参阅: http : //www.php.net/manual/en/install.windows.iis6.php

模仿和文件系统访问

build议在使用IIS时在PHP中启用FastCGI模拟。 这由php.ini文件中的fastcgi.impersonate指令控制。 启用模拟时,PHP将代表已通过IIS身份validation确定的用户帐户执行所有文件系统操作。

根据文档,它只是允许fastcgi代表客户使用所有相同的权限(在你的情况下,看起来像IUSR帐户)。 换句话说,要执行通常允许客户端(或匿名)自己的凭据的所有操作。 不多不less。 如果没有这一套,我想可怜的fastcgi将会被扼杀。