网站报错经典ASP页面找不到包含文件,但文件确实存在
|
freeflydom
2026年7月1日 16:44
本文热度 132
|
:网站报错经典ASP页面找不到包含文件,但文件确实存在
File: /test.asp/
Description: 找不到包含文件
ASP Description: 找不到包含文件“function/safe.asp”。
我自己测试访问页面是正常,什么原因导致的?
代码开头:
<!--#include file="function/safe.asp"-->
🔍 真正的原因
#include 使用的是相对路径:
<!--#include file="function/safe.asp"-->
而日志里请求的物理文件路径是:
File: /test.asp/(末尾多了一个 斜杠)
当你请求 /test.asp(不带斜杠)时,IIS 认为当前文件是站点根目录下的 test.asp,所以相对路径 function/safe.asp 解析为:
/function/safe.asp ✅ 可以找到。
但是当请求 /test.asp/(带斜杠)时,IIS 会把它当作一个目录来处理。这时“当前文件”的路径逻辑变得奇怪:它可能认为当前目录是 /test.asp/ 这个不存在的文件夹,那么相对路径 function/safe.asp 就会变成:
/test.asp/function/safe.asp ❌ 当然找不到。
所以你手动浏览器访问正常(默认不加斜杠),而攻击请求触发报错(加了斜杠)。
🛠️ 解决方案(按推荐顺序)
1️⃣ 立即在 IIS 层面禁止对 .asp 文件以斜杠结尾的请求
或者更简单地:
2️⃣ 在代码中防御
在所有 #include 之前,增加一段逻辑:如果 URL 末尾带斜杠,直接中断或重定向。
<%
Dim rawUrl
rawUrl = Request.ServerVariables("URL")
If Right(rawUrl, 1) = "/" Then
' 去掉末尾斜杠并永久重定向
Response.Status = "301 Moved Permanently"
Response.AddHeader "Location", Left(rawUrl, Len(rawUrl)-1)
Response.End
End If
%>把这段代码放在第1行(<%response.expires=0%> 之后、包含文件之前)。这样带斜杠的请求会被纠正,后续包含文件就能正确找到。
3️⃣ 改用绝对路径包含
如果不想改 URL 行为,可以修改 #include 为 virtual 绝对路径:
<!--#include virtual="/function/safe.asp"-->
这样无论当前文件被当成目录还是文件,virtual 总是从网站根目录开始找,不受末尾斜杠影响。
但要注意:这要求你的网站根目录下确实有 function/safe.asp,并且 IIS 启用了虚拟路径支持(默认启用)。这是最彻底的解决方法。
该文章在 2026/7/1 16:44:50 编辑过