我应该通过FastCGI模拟PHP吗?


16

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

 fastcgi.impersonate = 1

如果我的网站将具有此配置

  • 专用应用程序池
  • ApplicationPoolIdentity的应用程序池标识
  • 仅匿名身份验证(作为IUSR)

我为什么要假冒?

我来自ASP.NET背景,IUSR获得只读权限,而应用程序池标识获得任何写权限。授予对IUSR的写访问权通常会打开WebDAV漏洞的大门。因此,我犹豫让PHP作为IUSR运行。

我找不到很多人问这个问题(1 | 2),所以我想我一定很想念。有人可以帮我澄清一下吗?

Answers:


17

13个月后,我想重温我自己的问题。那时,我已经将六个网站从IIS 6转移到IIS 7.5,并使用我的首选方法对其进行了配置。我只能说这些网站可以正常运行,没有任何安全问题(不是这些网站很受欢迎),我认为该设置比learning.iis.net建议的设置更安全。

对于后代,以下是相关设置。在PHP INI中:

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

在IIS中:

  • 应用程序池>身份> ApplicationPoolIdentity
  • 网站>身份验证>匿名身份验证>特定用户:IUSR

NTFS权限及其应用位置:

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

我希望这对其他认为Learn.iis.net说明不理想的人有所帮助。


非常感谢!添加了批处理脚本以实现自动化。对于我的安装工作正常。
2013年

您应该启用imperanation,并将Authentication> Anonymous Access> Edit设置为Application Pool Identity。然后使用IIS APPPOOL \ <应用程序池名称>设置文件系统权限。
Monstieur 2013年

@Kurian是的,按照learning.iis.net的说明,该方法更简单。它还有其他好处吗?我选择上面概述的系统是因为它将应用程序的权限与Web用户的权限分开。
WimpyProgrammer 2013年

这样可以防止多个应用程序访问彼此的数据。如果没有一个应用程序被黑客入侵,如果没有ApplicationPoolIdentity,则可以将其用于入侵该服务器上的其他应用程序。其次,就权限而言,它使您可以像对待ASP.NET一样对待FastCGI。
Monstieur

我同意第一部分。ApplicationPoolIdentity非常适合沙箱应用程序,这就是我在上面也使用它的原因。第二点,我想我们对ASP.NET网站的管理方式有所不同。设置ASP.NET站点时,我对匿名用户使用IUSR,对应用程序池使用ApplicationPoolIdentity,并且权限与我上面概述的非常相似。
WimpyProgrammer

1

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

模拟和文件系统访问

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

根据文档,它只允许fastcgi使用所有相同的权限(代表您的IUSR帐户)代表客户端执行操作。换句话说,执行通常允许客户(或匿名)自己的凭据执行的所有操作。不多不少。没有这个设置,我想差的fastcgi将会残废。


在他的情况下就是这种情况,它将根据来宾帐户或其他内容进行访问。
马特

感谢您的回答,马特和鲍勃!我开始认为没有人会刺伤。
WimpyProgrammer 2011年

2
当PHP在没有模拟的情况下运行时,它将作为应用程序池标识运行。这使我可以为匿名用户授予只读权限,并为应用程序标识提供写权限。因此,如果没有模拟,PHP并非并非无助。我创建了一个可能澄清的测试。IUSR(匿名):授予读取权限,拒绝写入。应用程序身份:授予读/写权限。关闭模拟功能后,我仍然可以通过代码编写文件。假冒我无法。但是我不希望IUSR具有写访问权限。我想我会在其他论坛上问一些问题,等我知道更多后再回到这里。
WimpyProgrammer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.