假设您在 IIS 上有一个公共 ASP.NET(或经典 ASP)应用程序,其中的脚本/页面需要写入或更新位于 Web 发布文件夹树中的特定文件夹中的文件。
1)如何正确设置?
我主要担心的是,我想让 ASP/ASP.NET 应用程序写入文件夹,但不希望普通 http 用户能够将文件放入其中。
答案1
首先,我要说的是,我坚信几乎总有比将内容写入磁盘更好的解决方案。无论是将数据写入数据库,还是提供给 Web 服务,写入磁盘都应该是最后一个选项。话虽如此,也
有一些正当的理由,但这有点棘手,取决于应用程序需要写出文件的原因。
将数据写入代码运行位置之外是绝对必要的。出于显而易见的原因,允许最终用户写入 ASPX/asp 引擎可以解释/执行代码的路径是不好的。
其他一些影响这一情况的因素包括:
- 无论您是在域帐户下还是在标准网络服务下运行工作进程。重要的是要意识到,当您授予 IIS_WPG 组对文件夹的写入权限时,服务器上在默认帐户下运行的任何 ASP.NET 应用程序都可以将文件写入该文件夹。在运行多个应用程序的服务器上,这是一种不太理想的配置,尤其是当应用程序不受信任和/或在 ISP/共享托管环境中运行时。
- 生成的文件是否需要通过 Web 访问。如果您的应用程序只是写入一些非 Web 可查看的文件,则只需创建目录、授予权限并配置应用程序以读取/写入正确的位置即可。如果应用程序需要写入 Web 可查看的文件(这在内容管理场景中相当常见),您需要创建一个映射到可写目录的虚拟目录(没有执行代码/脚本权限)。
- 无论您是否在负载平衡/网络农场环境中工作。如果您的应用程序在农场环境中运行,并且由于某种原因需要将文件写入磁盘,那么您将面临一个全新的问题。如何使 webserver1 上的用户生成文件与 webserver2 上生成的文件保持同步?通过一些复杂的同步脚本执行此操作充其量是痛苦的,并且充斥着竞争/同步问题。实现此目的的最佳方法是在第三台服务器(理想情况下是具有一定冗余的集群)上创建共享并将数据存储在那里。如果您在域帐户下运行工作进程(安全最佳实践),您甚至可以在应用程序中映射到共享,而无需在代码或 web.config 中的任何地方使用用户/密码(让审计/安全人员感到高兴)。IIS 还能够将虚拟目录映射到 UNC 路径,因此这不会影响您使此内容可在网络上查看的能力。
答案2
App_Data 文件夹
为了提高 ASP.NET 应用程序所用数据的安全性,已为 ASP.NET 应用程序添加了一个名为 App_Data 的新子文件夹。存储在 App_Data 文件夹中的文件不会响应直接 HTTP 请求而返回,这使得 App_Data 文件夹成为应用程序存储数据的推荐位置,包括 .mdf(SQL Server Express Edition)、.mdb(Microsoft Access)或 XML 文件。请注意,当使用 App_Data 文件夹存储应用程序数据时,应用程序的身份对 App_Data 文件夹具有读写权限。
答案3
可能打赌看看stackoverflow.com...
最佳做法是将该文件夹放在文档根目录之外,并让您的应用从文件系统读取。否则,请将该文件夹设为只读,只有 ASP[.NET] 用户才能访问,并使用应用的内部授权控制写入权限。
答案4
默认情况下,App_Data 是可写但不可读的。服务器似乎拒绝任何更改此设置的行为。因此,最好创建一个全新的文件夹,并将其权限更改为不可执行、可读和可写。