我有一个繁忙的名人图片库网站,我试图将照片隐藏在网站根目录后面,这样就无法通过 URL 访问它们,但我的 ASP 脚本可以读取照片并以二进制形式将其发送到浏览器。我使用的是 Windows Server 2008 R2。
我想知道包含照片的文件夹应该采用哪些安全设置。我的网站位于c:\inetpub\vhosts\mydomain\httpdocs\website.asp
,照片需要存储在 D 盘:d:\web-library-photos\thumbs\group233\24wedfsdf232eraa.jpg
。
我确实设法通过简单地单击属性中的“共享” d:\web-library-photos
,然后授予“所有人”读/写权限来实现这一点,但我觉得我做错了什么。
我应该怎么做才能使此文件夹安全,但服务器管理员帐户和我的网站脚本可以访问?我应该应用哪些“共享”属性?我应该共享吗?
答案1
您的 ASP 应用程序在服务器计算机上本地运行,可以通过本地驱动器号和路径“D:...”访问图片文件。您正在查看的“共享”功能用于允许客户端计算机通过 CIFS / SMB 文件共享协议访问文件夹。您描述的应用程序中无需使用“共享”。
您的 ASP 应用程序在 IIS 设置的安全上下文下运行。默认情况下,匿名用户以 IUSR_machine-name 帐户(在 IIS 安装期间创建的帐户)执行 ASP 应用程序。
您的 ASP 应用程序访问的文件夹/文件的 NTFS 访问控制列表 (ACL) 必须允许 ASP 应用程序访问这些文件。需要在 ACL 中设置哪些权限取决于 ASP 应用程序所处的安全上下文。如果应用程序以匿名用户身份运行(即远程用户未执行 Windows 身份验证),则 IUSR_machine-name 用户帐户需要具有对该文件夹的权限。常规 NTFS 权限通常允许“用户/读取”,这对于访问来说已经足够了。
编辑:
您的屏幕截图显示了应用于给定文件夹的 ACL(即授予特定用户和组的权限)。这不是服务器计算机“知道”的所有用户帐户的详尽列表。该详尽列表可在“计算机管理”工具中的“本地用户和组”工具中访问。
在 Windows Server 计算机上执行的每个操作都是在“安全上下文”中执行的。应用程序要求操作系统代表用户执行的每个操作都必须归因于给定用户或计算机操作系统本身(在所有意图和目的上,也似乎是一个名称为“SYSTEM”或“LocalSystem”的用户,以及一个特殊的安全标识符序列号,将其标识为这个特定的特殊用户)。
当用户访问您的 ASP 脚本来查看图像时,IIS 会执行您的脚本,然后您的脚本会要求操作系统读取文件。如果用户未通过 IIS 中的内置身份验证机制之一对 IIS 进行身份验证,则用户对操作系统的访问将被视为匿名访问,并使用用户帐户 IUSR_machine-name 执行。(您的 ASP 应用程序可能内置有身份验证组件,但这不会影响 Windows 对远程用户“是谁”的概念——这只能由经典 ASP 应用程序通过使用 IIS 的内置身份验证功能来影响。)
向您逐步解释 Windows 安全子系统如何评估文件或文件夹的 ACL 以确定是否授予或拒绝用户访问权限,这远远超出了您的问题的范围。您提到您对此并不熟悉,因此我建议您查找解释 NTFS 权限如何工作的参考资料。您还可以在具有 NTFS 权限的 Windows PC 上进行实验并创建本地用户帐户,以了解其工作原理。