看事物要看本质,关键问题在于Server.MapPath()对相对路径的处理上。
去掉浏览器的显示友好Http是为了看到错误信息,方便调试,我写asp时就把这个对钩去掉了,不然只显示“内部服务器错误”,去掉后可以看到具体是哪行除了问题。
暴库有两种类型,一种是把目录的"\"改为"%5c",另一种是直接访问数据库连接文件,如conn.asp,但这两种情况并不是想象中的那样,总是有效的,而是有一定的条件的。
对于第一种,当把目录后的"\"改为"%5c",浏览器并不把"\"自动转换为"/"了,而是提交给IIS了处理了,如果数据库连接文件中用的是相对目录,假如数据库连接字符串中的Server.MapPath()是这样写的:Server.MapPath("/test/data/") & "data.mdb",我们把test目录后的"/"换为"%5c"后,到了IIS中就变为server.MapPath("/test\data")了,而这是IIS就认为Web的根目录为Data目录的父目录了,实际上就相当于这样了Server.MapPath("/data")了,这样就指不到真实的数据库的路径了,Connection对象调用open()方法时就会出错,在没有容错语句的情况下就抱错了,其实这也是调试asp错误的一种情况,只是对我们入侵有用罢了。
另一种情况是这样的,我们在一个文件中包含它所在目录的下一级目录中的数据库连接文件。如下所示,在index.asp中,有这么一句:
<!-- #Include File = "./Inc/Conn.asp" -->
而这时我们直接访问index.asp所在目录下的Inc目录中的conn.asp时,就有可能报错,给出错误调试信息,当然就是这个不正确的数据库路径了。前提是使用了Server.MapPath()并没有容错语句,原因是把conn.asp包含近来时,Server.MapPath()确定根目录时以当前目录为准,而直接访问./Inc/下的conn.asp时,IIS确定根目录是以INC目录为准,当然会出错了。
防范方法:
1、把IIS设置为不包错
2、在数据库连接文件中加容错语句
以上纯属个人观点,再者偶才疏学浅,如有错误请指出,不胜感激!!
Ps:机器上没有五笔,懒得下了,用的是智能ABC,所以别字泛滥,我也懒得改了。人懒,没办法 [s:91]