如何在IIS 10中配置站点上传目录静态文件仅允许ASP文件访问的权限
实现方案
完全可以实现仅允许站点ASP程序访问/upload目录静态文件、禁止直接URL访问的需求,核心思路是阻断所有直接HTTP访问/upload路径的可能,统一通过ASP代理脚本做权限校验后输出文件内容。
具体配置步骤
步骤1:禁止/upload目录的直接HTTP访问(二选一即可,优先选第一种)
方案A(最安全):将/upload目录移出站点Web根目录
比如你的站点根目录为C:\inetpub\wwwroot\myweb,则将上传目录迁移到C:\inetpub\private_upload,该路径不在Web站点的发布范围内,不可能被外部通过HTTP直接访问,只需给站点运行的IIS应用池账号授予该目录的读取权限即可。方案B(不移目录的情况):在/upload目录下新建web.config,添加如下配置直接拒绝所有HTTP访问请求:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <authorization> <deny users="*" /> </authorization> </system.webServer> </configuration>配置后所有直接访问
/upload/xxx的请求都会返回403禁止访问错误。步骤2:编写ASP代理脚本(示例文件名为
file_proxy.asp)该脚本负责校验用户登录状态、验证文件访问权限、读取静态文件内容输出给浏览器,示例代码如下:
<% ' 第一步:校验用户是否已登录,替换为你自己的登录态校验逻辑 If Session("user_id") = "" Then Response.Status = "403 Forbidden" Response.End End If ' 第二步:获取并校验请求的文件路径,防止目录遍历攻击 Dim req_path, real_file_path, upload_root upload_root = "C:\inetpub\private_upload\" ' 对应你实际的上传目录物理路径 req_path = Request.QueryString("path") ' 过滤危险字符,防止目录遍历 req_path = Replace(req_path, "../", "") req_path = Replace(req_path, "..\", "") req_path = Replace(req_path, "/", "\") real_file_path = upload_root & req_path ' 第三步:校验文件是否存在,且当前用户有权限访问该文件 Dim fso Set fso = Server.CreateObject("Scripting.FileSystemObject") If Not fso.FileExists(real_file_path) Then Response.Status = "404 Not Found" Response.End End If ' 额外权限校验:比如文件所属用户和当前登录用户一致,替换为你自己的逻辑 Dim file_owner file_owner = Split(req_path, "\")(0) ' 路径第一级为用户名,比如yuser\c.pdf取到yuser If file_owner <> Session("username") Then Response.Status = "403 Forbidden" Response.End End If ' 第四步:输出文件内容 Dim ext, mime ext = LCase(fso.GetExtensionName(real_file_path)) ' 根据后缀设置对应的MIME类型,可按需补充 Select Case ext Case "jpg", "jpeg": mime = "image/jpeg" Case "png": mime = "image/png" Case "pdf": mime = "application/pdf" Case Else: mime = "application/octet-stream" End Select Response.ContentType = mime ' 如果需要触发下载而不是预览,可添加以下行 ' Response.AddHeader "Content-Disposition", "attachment;filename=" & fso.GetFileName(real_file_path) Dim stream Set stream = Server.CreateObject("ADODB.Stream") stream.Open stream.Type = 1 ' 二进制模式 stream.LoadFromFile real_file_path Response.BinaryWrite stream.Read stream.Close Set stream = Nothing Set fso = Nothing %>步骤3:修改现有页面的资源引用方式
将原来直接指向/upload路径的链接全部替换为指向代理脚本的链接即可,示例:
原来的引用:<a href='http://mywebpage.com/upload/yuser/c.pdf'>yuser transcript</a> <img src='http://mywebpage.com/upload/xuser/a.jpg'/>修改后:
<a href='http://mywebpage.com/file_proxy.asp?path=yuser/c.pdf'>yuser transcript</a> <img src='http://mywebpage.com/file_proxy.asp?path=xuser/a.jpg'/>
额外安全优化建议
- 代理脚本的路径校验逻辑可以再增强,比如限制路径必须在上传目录范围内,避免过滤逻辑被绕过
- 大文件下载建议分块输出,避免占用过多服务器内存
- 可按需添加请求频率限制,防止批量爬取文件
内容的提问来源于stack exchange,提问作者user2046734
相关产品推荐
相关产品推荐

